@breadstone/archipel-mcp 0.0.22 → 0.0.25

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 (180) hide show
  1. package/README.md +32 -13
  2. package/data/guides/ai-text-generation.md +16 -24
  3. package/data/guides/caching.md +33 -0
  4. package/data/guides/email-delivery.md +27 -1
  5. package/data/guides/email-templates.md +49 -39
  6. package/data/guides/esigning-integration.md +11 -5
  7. package/data/guides/health-indicators.md +220 -0
  8. package/data/guides/index.md +2 -0
  9. package/data/guides/queue-infrastructure.md +329 -0
  10. package/data/guides/telemetry-and-observability.md +20 -0
  11. package/data/packages/platform-analytics/api/Class.AnalyticsClientPort.md +20 -0
  12. package/data/packages/platform-analytics/api/Class.AnalyticsHealthIndicator.md +78 -0
  13. package/data/packages/platform-analytics/api/Class.AppInsightsAnalyticsClient.md +24 -0
  14. package/data/packages/platform-analytics/api/Class.DatadogAnalyticsClient.md +24 -0
  15. package/data/packages/platform-analytics/api/Class.NoopAnalyticsClient.md +24 -0
  16. package/data/packages/platform-analytics/api/Class.SentryAnalyticsClient.md +24 -0
  17. package/data/packages/platform-analytics/api/index.md +1 -0
  18. package/data/packages/platform-analytics/index.md +25 -1
  19. package/data/packages/platform-authentication/api/Class.AuthenticationHealthIndicator.md +68 -0
  20. package/data/packages/platform-authentication/api/Interface.IMfaSubjectUpdate.md +1 -1
  21. package/data/packages/platform-authentication/api/index.md +2 -1
  22. package/data/packages/platform-authentication/index.md +25 -1
  23. package/data/packages/platform-blob-storage/api/Class.BlobHealthIndicator.md +7 -7
  24. package/data/packages/platform-blob-storage/api/Class.BlobModule.md +2 -2
  25. package/data/packages/platform-blob-storage/api/Interface.IAwsS3BlobProviderRegistration.md +3 -3
  26. package/data/packages/platform-blob-storage/api/Interface.IAzureBlobProviderRegistration.md +3 -3
  27. package/data/packages/platform-blob-storage/api/Interface.IBlobModuleOptions.md +5 -5
  28. package/data/packages/platform-blob-storage/api/Interface.ICustomBlobProviderRegistration.md +3 -3
  29. package/data/packages/platform-blob-storage/api/Interface.IVercelBlobProviderRegistration.md +3 -3
  30. package/data/packages/platform-blob-storage/api/TypeAlias.IBlobProviderRegistration.md +1 -1
  31. package/data/packages/platform-blob-storage/api/index.md +1 -1
  32. package/data/packages/platform-blob-storage/index.md +19 -14
  33. package/data/packages/platform-caching/api/Class.MemoryLayeredCache.md +10 -10
  34. package/data/packages/platform-caching/api/Class.NoopCacheMetricsRecorder.md +6 -6
  35. package/data/packages/platform-caching/api/Class.RedisLayeredCache.md +13 -13
  36. package/data/packages/platform-caching/api/Interface.ILayeredCache.md +9 -9
  37. package/data/packages/platform-caching/api/Interface.ILayeredCacheOptions.md +6 -6
  38. package/data/packages/platform-caching/api/Variable.CACHE_DEFAULT_TTL_MS.md +14 -0
  39. package/data/packages/platform-caching/api/Variable.CACHE_MAX_ENTRIES.md +14 -0
  40. package/data/packages/platform-caching/api/Variable.CACHE_STALE_WHILE_REVALIDATE.md +14 -0
  41. package/data/packages/platform-caching/api/Variable.PLATFORM_CACHING_CONFIG_ENTRIES.md +14 -0
  42. package/data/packages/platform-caching/api/Variable.REDIS_CONFIG_ENTRIES.md +14 -0
  43. package/data/packages/platform-caching/api/Variable.REDIS_KEY_PREFIX.md +14 -0
  44. package/data/packages/platform-caching/api/Variable.REDIS_TTL_SECONDS.md +14 -0
  45. package/data/packages/platform-caching/api/Variable.REDIS_URL.md +14 -0
  46. package/data/packages/platform-caching/api/index.md +13 -0
  47. package/data/packages/platform-caching/index.md +47 -1
  48. package/data/packages/platform-configuration/api/Function.createConfigKey.md +1 -1
  49. package/data/packages/platform-core/api/Class.HttpLoggerMiddleware.md +3 -3
  50. package/data/packages/platform-core/api/Function.maskSensitive.md +26 -0
  51. package/data/packages/platform-core/api/Function.maskSensitiveFields.md +26 -0
  52. package/data/packages/platform-core/api/index.md +2 -0
  53. package/data/packages/platform-core/index.md +11 -0
  54. package/data/packages/platform-database/api/Class.DatabaseHealthIndicator.md +8 -6
  55. package/data/packages/platform-database/api/Class.DatabaseModule.md +3 -3
  56. package/data/packages/platform-database/api/Class.RepositoryBase.md +20 -20
  57. package/data/packages/platform-database/api/Function.paginator.md +1 -1
  58. package/data/packages/platform-database/api/Interface.IDatabaseModuleConfig.md +3 -3
  59. package/data/packages/platform-database/api/TypeAlias.DelegateArgs.md +1 -1
  60. package/data/packages/platform-database/api/TypeAlias.DelegateReturnTypes.md +1 -1
  61. package/data/packages/platform-database/api/TypeAlias.PaginateFunction.md +1 -1
  62. package/data/packages/platform-database/api/Variable.DATABASE_MODULE_CONFIG.md +1 -1
  63. package/data/packages/platform-database/index.md +17 -5
  64. package/data/packages/platform-documents/api/Class.DocumentEngine.md +9 -5
  65. package/data/packages/platform-documents/index.md +1 -1
  66. package/data/packages/platform-esigning/api/Class.AdobeSignEsigningProvider.md +24 -0
  67. package/data/packages/platform-esigning/api/Class.DocuSignEsigningProvider.md +24 -0
  68. package/data/packages/platform-esigning/api/Class.DropboxSignEsigningProvider.md +24 -0
  69. package/data/packages/platform-esigning/api/Class.EsigningClientPort.md +20 -0
  70. package/data/packages/platform-esigning/api/Class.EsigningHealthIndicator.md +78 -0
  71. package/data/packages/platform-esigning/api/Class.InternalEsigningProvider.md +24 -0
  72. package/data/packages/platform-esigning/api/index.md +1 -0
  73. package/data/packages/platform-esigning/index.md +26 -2
  74. package/data/packages/platform-health/api/Class.HealthModule.md +42 -0
  75. package/data/packages/platform-health/api/Class.HealthOrchestrator.md +64 -0
  76. package/data/packages/platform-health/api/Interface.IHealthCheckResult.md +46 -0
  77. package/data/packages/platform-health/api/Interface.IHealthIndicator.md +41 -0
  78. package/data/packages/platform-health/api/Variable.HEALTH_INDICATORS_TOKEN.md +14 -0
  79. package/data/packages/platform-health/api/index.md +26 -0
  80. package/data/packages/platform-health/index.md +19 -8
  81. package/data/packages/platform-intelligence/api/Class.IntelligenceHealthIndicator.md +78 -0
  82. package/data/packages/platform-intelligence/api/index.md +1 -0
  83. package/data/packages/platform-intelligence/index.md +24 -1
  84. package/data/packages/platform-logging/api/Class.ContextLogger.md +152 -0
  85. package/data/packages/platform-logging/api/Class.LoggerModule.md +8 -2
  86. package/data/packages/platform-logging/api/Class.RequestContextStore.md +90 -0
  87. package/data/packages/platform-logging/api/Class.RequestIdMiddleware.md +68 -0
  88. package/data/packages/platform-logging/api/Interface.IRequestContext.md +34 -0
  89. package/data/packages/platform-logging/api/Variable.REQUEST_ID_HEADER.md +14 -0
  90. package/data/packages/platform-logging/api/index.md +11 -1
  91. package/data/packages/platform-logging/index.md +89 -7
  92. package/data/packages/platform-mailing/api/Class.MailHealthIndicator.md +5 -5
  93. package/data/packages/platform-mailing/api/Class.MailModule.md +28 -1
  94. package/data/packages/platform-mailing/api/Class.MailVerificationService.md +49 -16
  95. package/data/packages/platform-mailing/api/Class.SmtpConnectionVerifier.md +84 -0
  96. package/data/packages/platform-mailing/api/Interface.IMailModuleOptions.md +36 -0
  97. package/data/packages/platform-mailing/api/index.md +3 -1
  98. package/data/packages/platform-mailing/index.md +64 -8
  99. package/data/packages/platform-mapping/api/Class.MappingBuilder.md +110 -0
  100. package/data/packages/platform-mapping/api/Class.MappingError.md +56 -0
  101. package/data/packages/platform-mapping/api/Class.MappingModule.md +46 -0
  102. package/data/packages/platform-mapping/api/Class.MappingNotRegisteredError.md +52 -0
  103. package/data/packages/platform-mapping/api/Class.MappingProfileBase.md +52 -0
  104. package/data/packages/platform-mapping/api/Class.MappingService.md +284 -0
  105. package/data/packages/platform-mapping/api/Class.TypeMappingNotRegisteredError.md +53 -0
  106. package/data/packages/platform-mapping/api/Function.createMappingKey.md +39 -0
  107. package/data/packages/platform-mapping/api/Interface.IMappingBuilder.md +76 -0
  108. package/data/packages/platform-mapping/api/Interface.IMappingKey.md +58 -0
  109. package/data/packages/platform-mapping/api/Interface.IMappingProfile.md +32 -0
  110. package/data/packages/platform-mapping/api/TypeAlias.Constructor.md +28 -0
  111. package/data/packages/platform-mapping/api/index.md +38 -0
  112. package/data/packages/platform-mapping/index.md +1 -1
  113. package/data/packages/platform-mcp/api/Class.McpHealthIndicator.md +78 -0
  114. package/data/packages/platform-mcp/api/index.md +1 -0
  115. package/data/packages/platform-mcp/index.md +24 -1
  116. package/data/packages/platform-openapi/api/Function.SwaggerFeature.md +2 -2
  117. package/data/packages/platform-openapi/api/Function.getSwaggerFeatureMetadata.md +2 -2
  118. package/data/packages/platform-payments/api/Class.LemonSqueezyClient.md +24 -0
  119. package/data/packages/platform-payments/api/Class.MollieClient.md +24 -0
  120. package/data/packages/platform-payments/api/Class.PaddleClient.md +24 -0
  121. package/data/packages/platform-payments/api/Class.PaymentClientPort.md +20 -0
  122. package/data/packages/platform-payments/api/Class.PaymentHealthIndicator.md +78 -0
  123. package/data/packages/platform-payments/api/Class.StripeClient.md +28 -4
  124. package/data/packages/platform-payments/api/index.md +1 -0
  125. package/data/packages/platform-payments/index.md +26 -2
  126. package/data/packages/platform-queue/api/Class.AzureQueue.md +221 -0
  127. package/data/packages/platform-queue/api/Class.BullMqQueue.md +220 -0
  128. package/data/packages/platform-queue/api/Class.MemoryQueue.md +194 -0
  129. package/data/packages/platform-queue/api/Class.QueueError.md +51 -0
  130. package/data/packages/platform-queue/api/Class.QueueHealthIndicator.md +68 -0
  131. package/data/packages/platform-queue/api/Class.QueueJobNotFoundError.md +43 -0
  132. package/data/packages/platform-queue/api/Class.QueueJobStateError.md +48 -0
  133. package/data/packages/platform-queue/api/Class.QueueValidationError.md +43 -0
  134. package/data/packages/platform-queue/api/Interface.IAzureQueueOptions.md +48 -0
  135. package/data/packages/platform-queue/api/Interface.IBullMqQueueOptions.md +45 -0
  136. package/data/packages/platform-queue/api/Interface.IMemoryQueueOptions.md +32 -0
  137. package/data/packages/platform-queue/api/Interface.IQueue.md +173 -0
  138. package/data/packages/platform-queue/api/Interface.IQueueJob.md +139 -0
  139. package/data/packages/platform-queue/api/TypeAlias.QueueJobStatus.md +14 -0
  140. package/data/packages/platform-queue/api/Variable.AZURE_CONFIG_ENTRIES.md +17 -0
  141. package/data/packages/platform-queue/api/Variable.AZURE_CONNECTION_STRING.md +14 -0
  142. package/data/packages/platform-queue/api/Variable.AZURE_RECEIVE_WAIT_MS.md +21 -0
  143. package/data/packages/platform-queue/api/Variable.BULLMQ_CONFIG_ENTRIES.md +17 -0
  144. package/data/packages/platform-queue/api/Variable.BULLMQ_PREFIX.md +18 -0
  145. package/data/packages/platform-queue/api/Variable.BULLMQ_REDIS_URL.md +21 -0
  146. package/data/packages/platform-queue/api/Variable.PLATFORM_QUEUE_CONFIG_ENTRIES.md +17 -0
  147. package/data/packages/platform-queue/api/Variable.QUEUE_JOB_STATUS.md +30 -0
  148. package/data/packages/platform-queue/api/Variable.QUEUE_MAX_JOBS.md +21 -0
  149. package/data/packages/platform-queue/api/index.md +49 -0
  150. package/data/packages/platform-queue/index.md +168 -0
  151. package/data/packages/platform-resources/api/Class.BlobResourceStrategy.md +195 -0
  152. package/data/packages/platform-resources/api/Class.EmbeddedResourceStrategy.md +215 -0
  153. package/data/packages/platform-resources/api/Class.FileResourceStrategy.md +190 -0
  154. package/data/packages/platform-resources/api/Class.ResourceManager.md +477 -0
  155. package/data/packages/platform-resources/api/Class.ResourceModule.md +46 -0
  156. package/data/packages/platform-resources/api/Class.ResourceNotFoundError.md +60 -0
  157. package/data/packages/platform-resources/api/Interface.IBlobResourceStrategyConfig.md +28 -0
  158. package/data/packages/platform-resources/api/Interface.IBlobServiceAdapter.md +40 -0
  159. package/data/packages/platform-resources/api/Interface.IFileResourceStrategyConfig.md +72 -0
  160. package/data/packages/platform-resources/api/Interface.IResourceManagerConfig.md +89 -0
  161. package/data/packages/platform-resources/api/Interface.IResourceMetadata.md +94 -0
  162. package/data/packages/platform-resources/api/Interface.IResourceResult.md +34 -0
  163. package/data/packages/platform-resources/api/Interface.IResourceStrategy.md +134 -0
  164. package/data/packages/platform-resources/api/index.md +29 -0
  165. package/data/packages/platform-resources/index.md +1 -1
  166. package/data/packages/platform-telemetry/api/Class.OtelSdkHolder.md +21 -3
  167. package/data/packages/platform-telemetry/api/Class.TelemetryHealthIndicator.md +78 -0
  168. package/data/packages/platform-telemetry/api/index.md +1 -0
  169. package/data/packages/platform-telemetry/index.md +25 -1
  170. package/data/patterns/config-pattern.md +5 -3
  171. package/package.json +2 -2
  172. package/src/tools/registerGetConfigPatternTool.js +1 -1
  173. package/src/tools/registerGetDtoPatternTool.js +1 -1
  174. package/src/tools/registerGetErrorHandlingPatternTool.js +1 -1
  175. package/src/tools/registerGetGuardPatternTool.js +1 -1
  176. package/src/tools/registerGetMappingPatternTool.js +1 -1
  177. package/src/tools/registerGetModulePatternTool.js +1 -1
  178. package/src/tools/registerGetQueryPatternTool.js +1 -1
  179. package/src/tools/registerGetRepositoryPatternTool.js +1 -1
  180. package/src/tools/registerGetTestingPatternTool.js +1 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @breadstone/archipel-mcp
2
2
 
3
- MCP (Model Context Protocol) server that provides Archipel platform knowledge documentation and query patterns to AI development tools. The server acts as a structured knowledge provider: AI models combine this knowledge with the user's project context to generate framework-compliant code.
3
+ MCP (Model Context Protocol) server that provides Archipel platform knowledge - documentation and query patterns - to AI development tools. The server acts as a structured knowledge provider: AI models combine this knowledge with the user's project context to generate framework-compliant code.
4
4
 
5
5
  ## Usage
6
6
 
@@ -40,30 +40,49 @@ npx @breadstone/archipel-mcp
40
40
  Returns the complete Archipel v1 query pattern: `IRepositoryQuery` interface, `query()` factory, `QueryResultType`, transactional queries, rules, and usage examples. When a `modelName` and `fields` array are provided, it generates tailored `findFirst`, `findMany`, and `count` query examples for that model.
41
41
 
42
42
  ```
43
- modelName?: string Prisma model name (e.g. "User")
44
- fields?: string[] Field names (e.g. ["id", "email", "name", "createdAt"])
43
+ modelName?: string - Prisma model name (e.g. "User")
44
+ fields?: string[] - Field names (e.g. ["id", "email", "name", "createdAt"])
45
45
  ```
46
46
 
47
47
  ## Architecture
48
48
 
49
49
  Plain Node.js MCP server using `@modelcontextprotocol/sdk`. No NestJS, no DI container.
50
50
 
51
- ```
52
- main.ts ← CLI entry (stdio transport, tool registration)
53
- DocsLoader.ts Loads & indexes .docs/packages/ markdown files
54
- models/
55
- └── IPackageDoc.ts Package documentation interface
56
- knowledge/
57
- └── queryPattern.ts ← Query pattern knowledge content
51
+ ```mermaid
52
+ flowchart TB
53
+ MainTs[main.ts\nCLI entry\nstdio transport + tool registration]
54
+ DocsLoader[DocsLoader.ts\nLoads and indexes .docs/packages]
55
+ GuidesLoader[GuidesLoader.ts\nLoads and indexes .docs/guides]
56
+ PatternsLoader[PatternsLoader.ts\nLoads and indexes .docs/patterns]
57
+
58
+ subgraph Models[models/]
59
+ IPackageDoc[IPackageDoc.ts\nPackage documentation interface]
60
+ IGuideDoc[IGuideDoc.ts\nGuide documentation interface]
61
+ IPatternDoc[IPatternDoc.ts\nPattern documentation interface]
62
+ end
63
+
64
+ subgraph Generators[generators/]
65
+ QueryGenerator[queryPatternGenerator.ts]
66
+ RepositoryGenerator[repositoryPatternGenerator.ts]
67
+ MappingGenerator[mappingPatternGenerator.ts]
68
+ ModuleGenerator[modulePatternGenerator.ts]
69
+ end
70
+
71
+ MainTs --> DocsLoader
72
+ MainTs --> GuidesLoader
73
+ MainTs --> PatternsLoader
74
+ DocsLoader --> IPackageDoc
75
+ GuidesLoader --> IGuideDoc
76
+ PatternsLoader --> IPatternDoc
58
77
  ```
59
78
 
60
79
  ### Documentation Resolution
61
80
 
62
81
  The server locates docs in this order:
63
82
 
64
- 1. **Bundled data** `<package>/data/packages/` (shipped with the npm package)
65
- 2. **Workspace root** `<cwd>/.docs/packages/` (monorepo development)
66
- 3. **Relative fallback** walks up from compiled source to find `.docs/packages/`
83
+ 1. **Bundled data** - `<package>/data/packages/` (shipped with the npm package)
84
+ 2. **Workspace root** - `<cwd>/.docs/packages/` (monorepo development)
85
+ 3. **Relative fallback** - walks up from compiled source to find `.docs/packages/`
67
86
 
68
87
  ## Development
69
88
 
@@ -368,28 +368,20 @@ If an AI SDK provider package is not installed, the error message clearly states
368
368
 
369
369
  ## Architecture Overview
370
370
 
371
- ```
372
- ┌────────────────────────────────────┐
373
- IntelligenceModule
374
- │ │
375
- │ ┌──────────────────────────────┐ │
376
- │ IntelligenceTextGenerator │──┼── generateText(prompt, options?)
377
- │ │ (ConfigService → provider) │ │
378
- └──────────────────────────────┘ │
379
- │ │
380
- ┌──────────────────────────────┐ │
381
- │ IntelligenceCapability │──┼── resolve(intent, context)
382
- │ │ Registry │ │ register(capability)
383
- └──────────────────────────────┘ │
384
- └────────────────────────────────────┘
385
- │ │
386
- ▼ ▼
387
- ┌─────────────┐ ┌──────────────┐
388
- │ Provider │ │ Feature │
389
- │ Loaders │ │ Capabilities │
390
- │ (OpenAI, │ │ (custom │
391
- │ Anthropic, │ │ handlers) │
392
- │ Google, │ │ │
393
- │ Grok) │ │ │
394
- └─────────────┘ └──────────────┘
371
+ ```mermaid
372
+ flowchart TB
373
+ subgraph IntelligenceModule[IntelligenceModule]
374
+ TextGenerator[IntelligenceTextGenerator\nConfigService -> provider]
375
+ CapabilityRegistry[IntelligenceCapability Registry]
376
+ end
377
+
378
+ GenerateText["generateText(prompt, options?)"]
379
+ ResolveCapability["resolve(intent, context)\nregister(capability)"]
380
+ ProviderLoaders[Provider Loaders\nOpenAI, Anthropic, Google, Grok]
381
+ FeatureCapabilities[Feature Capabilities\ncustom handlers]
382
+
383
+ TextGenerator --> GenerateText
384
+ CapabilityRegistry --> ResolveCapability
385
+ TextGenerator --> ProviderLoaders
386
+ CapabilityRegistry --> FeatureCapabilities
395
387
  ```
@@ -24,6 +24,39 @@ yarn add ioredis
24
24
 
25
25
  ---
26
26
 
27
+ ## Configuration
28
+
29
+ ### Core Variables
30
+
31
+ ```env
32
+ CACHE_DEFAULT_TTL_MS=60000
33
+ CACHE_MAX_ENTRIES=1000
34
+ CACHE_STALE_WHILE_REVALIDATE=false
35
+ ```
36
+
37
+ All core variables are optional. When omitted, each cache instance uses the values passed directly to its constructor options.
38
+
39
+ ### Redis Variables
40
+
41
+ ```env
42
+ REDIS_URL=redis://localhost:6379
43
+ REDIS_KEY_PREFIX=app:
44
+ REDIS_TTL_SECONDS=300
45
+ ```
46
+
47
+ `REDIS_URL` is required when using `RedisLayeredCache`. The other variables are optional.
48
+
49
+ ### Using Config Keys
50
+
51
+ Import the typed config keys and pass them to your module registration:
52
+
53
+ ```typescript
54
+ import { PLATFORM_CACHING_CONFIG_ENTRIES } from '@breadstone/archipel-platform-caching';
55
+ import { REDIS_CONFIG_ENTRIES } from '@breadstone/archipel-platform-caching/redis';
56
+ ```
57
+
58
+ ---
59
+
27
60
  ## Concepts
28
61
 
29
62
  `platform-caching` provides a generic `ILayeredCache<TKey, TValue>` interface with two implementations:
@@ -147,7 +147,33 @@ The `template` field is the template name (without extension). The `context` obj
147
147
 
148
148
  ---
149
149
 
150
- ## Email Verification
150
+ ## SMTP Connection Verification
151
+
152
+ `SmtpConnectionVerifier` verifies SMTP server connectivity and optionally sends a test email. It replaces the deprecated `MailVerificationService`.
153
+
154
+ ```typescript
155
+ import { Injectable } from '@nestjs/common';
156
+ import { SmtpConnectionVerifier } from '@breadstone/archipel-platform-mailing';
157
+
158
+ @Injectable()
159
+ export class HealthService {
160
+ constructor(private readonly _smtpVerifier: SmtpConnectionVerifier) {}
161
+
162
+ public async checkSmtpConnectivity(): Promise<boolean> {
163
+ return this._smtpVerifier.verifyConnection();
164
+ }
165
+
166
+ public async sendTestEmail(to: string): Promise<boolean> {
167
+ return this._smtpVerifier.sendTestEmail(to);
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## Email Verification (Deprecated)
173
+
174
+ ::: warning Deprecated
175
+ `MailVerificationService` is deprecated. Use `SmtpConnectionVerifier` for SMTP connectivity checks.
176
+ :::
151
177
 
152
178
  `MailVerificationService` provides a complete email verification flow:
153
179
 
@@ -16,16 +16,14 @@ This guide explains how to create email templates for `platform-mailing` and reg
16
16
 
17
17
  `platform-mailing` does **not** ship ready-made template files. It defines a list of known template **names** and loads the actual content through `ResourceManager` at startup.
18
18
 
19
- ```
20
- ┌──────────────┐ ┌─────────────────────────┐ ┌──────────────────┐
21
- MailService │────▶│ MailTemplateEngine │────▶│ ResourceManager │
22
- sendTemplate()│ │ compileTemplate() │ │ tryLoadAsync()
23
- └──────────────┘ └─────────────────────────┘ └──────────────────┘
24
- │ │
25
- ▼ ▼
26
- ContentTemplateEngine FileResourceStrategy
27
- (variable interpolation) BlobResourceStrategy
28
- EmbeddedResourceStrategy
19
+ ```mermaid
20
+ flowchart LR
21
+ MailService["MailService<br/>sendTemplate()"] --> MailTemplateEngine["MailTemplateEngine<br/>compileTemplate()"]
22
+ MailTemplateEngine --> ResourceManager["ResourceManager<br/>tryLoadAsync()"]
23
+ MailTemplateEngine --> ContentTemplateEngine["ContentTemplateEngine<br/>variable interpolation"]
24
+ ResourceManager --> FileResourceStrategy[FileResourceStrategy]
25
+ ResourceManager --> BlobResourceStrategy[BlobResourceStrategy]
26
+ ResourceManager --> EmbeddedResourceStrategy[EmbeddedResourceStrategy]
29
27
  ```
30
28
 
31
29
  1. `MailService.sendTemplate()` passes the template name and context variables to `MailTemplateEngine`.
@@ -59,18 +57,18 @@ Templates use a Handlebars-style syntax powered by `ContentTemplateEngine`:
59
57
 
60
58
  | Syntax | Description |
61
59
  | ---------------------------------------------- | --------------------------------- |
62
- | `{{variableName}}` | Simple variable substitution |
63
- | `{{#if condition}}...{{/if}}` | Conditional block |
64
- | `{{#if condition}}...{{else}}...{{/if}}` | Conditional with else |
65
- | `{{#unless condition}}...{{/unless}}` | Negative conditional |
66
- | `{{#each items}}...{{/each}}` | Loop over array |
67
- | `{{#with object}}...{{/with}}` | Context switching |
68
- | `{{@index}}`, `{{@first}}`, `{{@last}}` | Loop metadata inside `#each` |
69
- | `{{nested.property}}` | Dot notation for nested values |
60
+ | `<code>&#123;&#123;variableName&#125;&#125;</code>` | Simple variable substitution |
61
+ | `<code>&#123;&#123;#if condition&#125;&#125;...&#123;&#123;/if&#125;&#125;</code>` | Conditional block |
62
+ | `<code>&#123;&#123;#if condition&#125;&#125;...&#123;&#123;else&#125;&#125;...&#123;&#123;/if&#125;&#125;</code>` | Conditional with else |
63
+ | `<code>&#123;&#123;#unless condition&#125;&#125;...&#123;&#123;/unless&#125;&#125;</code>` | Negative conditional |
64
+ | `<code>&#123;&#123;#each items&#125;&#125;...&#123;&#123;/each&#125;&#125;</code>` | Loop over array |
65
+ | `<code>&#123;&#123;#with object&#125;&#125;...&#123;&#123;/with&#125;&#125;</code>` | Context switching |
66
+ | `<code>&#123;&#123;@index&#125;&#125;</code>`, `<code>&#123;&#123;@first&#125;&#125;</code>`, `<code>&#123;&#123;@last&#125;&#125;</code>` | Loop metadata inside `#each` |
67
+ | `<code>&#123;&#123;nested.property&#125;&#125;</code>` | Dot notation for nested values |
70
68
 
71
69
  ### Example: `AuthVerify.html`
72
70
 
73
- ```html
71
+ ```text
74
72
  <!DOCTYPE html>
75
73
  <html>
76
74
  <head>
@@ -78,14 +76,14 @@ Templates use a Handlebars-style syntax powered by `ContentTemplateEngine`:
78
76
  <title>Verify your email</title>
79
77
  </head>
80
78
  <body>
81
- <h1>Hello, {{userName}}!</h1>
79
+ <h1>Hello, &#123;&#123;userName&#125;&#125;!</h1>
82
80
  <p>Please verify your email address by clicking the link below:</p>
83
81
  <p>
84
- <a href="{{verificationUrl}}">Verify Email</a>
82
+ <a href="&#123;&#123;verificationUrl&#125;&#125;">Verify Email</a>
85
83
  </p>
86
- {{#if expiresInHours}}
87
- <p>This link expires in {{expiresInHours}} hours.</p>
88
- {{/if}}
84
+ &#123;&#123;#if expiresInHours&#125;&#125;
85
+ <p>This link expires in &#123;&#123;expiresInHours&#125;&#125; hours.</p>
86
+ &#123;&#123;/if&#125;&#125;
89
87
  <p>If you did not create an account, you can safely ignore this email.</p>
90
88
  </body>
91
89
  </html>
@@ -94,13 +92,13 @@ Templates use a Handlebars-style syntax powered by `ContentTemplateEngine`:
94
92
  ### Example: `AuthVerify.txt`
95
93
 
96
94
  ```text
97
- Hello, {{userName}}!
95
+ Hello, &#123;&#123;userName&#125;&#125;!
98
96
 
99
97
  Please verify your email address by visiting the following link:
100
98
 
101
- {{verificationUrl}}
99
+ &#123;&#123;verificationUrl&#125;&#125;
102
100
 
103
- {{#if expiresInHours}}This link expires in {{expiresInHours}} hours.{{/if}}
101
+ &#123;&#123;#if expiresInHours&#125;&#125;This link expires in &#123;&#123;expiresInHours&#125;&#125; hours.&#123;&#123;/if&#125;&#125;
104
102
 
105
103
  If you did not create an account, you can safely ignore this email.
106
104
  ```
@@ -117,18 +115,30 @@ When the format is `html`, `MailTemplateEngine` automatically **escapes all cont
117
115
 
118
116
  Place your template files in your application's assets directory and register the path with `ResourceModule`:
119
117
 
120
- ```
121
- my-app/
122
- ├── src/
123
- │ ├── assets/
124
- │ │ ├── AuthRegister.html
125
- │ │ ├── AuthRegister.txt
126
- │ │ ├── AuthVerify.html
127
- │ │ ├── AuthVerify.txt
128
- │ │ ├── AuthForgotPassword.html
129
- │ │ ├── AppointmentInvitation.html
130
- │ │ └── AppointmentUpdate.html
131
- │ └── app.module.ts
118
+ ```mermaid
119
+ flowchart TB
120
+ Root[my-app/]
121
+ Src[src/]
122
+ Assets[assets/]
123
+ AppModule[app.module.ts]
124
+ AuthRegisterHtml[AuthRegister.html]
125
+ AuthRegisterTxt[AuthRegister.txt]
126
+ AuthVerifyHtml[AuthVerify.html]
127
+ AuthVerifyTxt[AuthVerify.txt]
128
+ AuthForgotPasswordHtml[AuthForgotPassword.html]
129
+ AppointmentInvitationHtml[AppointmentInvitation.html]
130
+ AppointmentUpdateHtml[AppointmentUpdate.html]
131
+
132
+ Root --> Src
133
+ Src --> Assets
134
+ Src --> AppModule
135
+ Assets --> AuthRegisterHtml
136
+ Assets --> AuthRegisterTxt
137
+ Assets --> AuthVerifyHtml
138
+ Assets --> AuthVerifyTxt
139
+ Assets --> AuthForgotPasswordHtml
140
+ Assets --> AppointmentInvitationHtml
141
+ Assets --> AppointmentUpdateHtml
132
142
  ```
133
143
 
134
144
  ```typescript
@@ -56,11 +56,17 @@ export class AppModule {}
56
56
 
57
57
  ## Configuration
58
58
 
59
- ```env
60
- ESIGNING_API_BASE_URL=https://demo.docusign.net/restapi
61
- ESIGNING_API_KEY=your-api-key
62
- ESIGNING_WEBHOOK_SECRET=your-webhook-secret
63
- ```
59
+ Each provider requires its own set of environment variables. See the [platform-esigning package docs](../packages/platform-esigning/) for the full table per provider.
60
+
61
+ ### Provider Environment Variables (Summary)
62
+
63
+ | Provider | Key Variables |
64
+ | -------------- | -------------------------------------------------------------------------------------------------- |
65
+ | **DocuSign** | `DOCUSIGN_INTEGRATION_KEY`, `DOCUSIGN_SECRET_KEY`, `DOCUSIGN_ACCOUNT_ID`, `DOCUSIGN_BASE_URL` |
66
+ | **Adobe Sign** | `ADOBE_SIGN_INTEGRATION_KEY`, `ADOBE_SIGN_CLIENT_SECRET`, `ADOBE_SIGN_BASE_URL`, `ADOBE_SIGN_WEBHOOK_CLIENT_ID` (required) |
67
+ | **Dropbox Sign** | `DROPBOX_SIGN_API_KEY`, `DROPBOX_SIGN_CLIENT_ID` |
68
+
69
+ > **Breaking change:** `ADOBE_SIGN_WEBHOOK_CLIENT_ID` is now **required** for Adobe Sign webhook verification.
64
70
 
65
71
  ---
66
72
 
@@ -0,0 +1,220 @@
1
+ ---
2
+ title: Health Indicators
3
+ description: Integrate health checks from all Archipel platform libraries using the unified health indicator architecture.
4
+ order: 10
5
+ ---
6
+
7
+ # Health Indicators
8
+
9
+ Every Archipel platform library ships an optional **health indicator** as a separate `/health` subpath export. Health indicators implement the `IHealthIndicator` interface from `platform-health` and can be registered with the `HealthModule` to build a unified `/health` endpoint for your application.
10
+
11
+ ## Architecture
12
+
13
+ ```mermaid
14
+ flowchart LR
15
+ subgraph App
16
+ HealthController --> HealthOrchestrator
17
+ end
18
+
19
+ subgraph platform-health
20
+ HealthOrchestrator
21
+ end
22
+
23
+ subgraph Indicators
24
+ DatabaseHealthIndicator
25
+ BlobHealthIndicator
26
+ MailHealthIndicator
27
+ CachingHealthIndicator
28
+ QueueHealthIndicator
29
+ PaymentHealthIndicator
30
+ EsigningHealthIndicator
31
+ IntelligenceHealthIndicator
32
+ AnalyticsHealthIndicator
33
+ TelemetryHealthIndicator
34
+ AuthenticationHealthIndicator
35
+ McpHealthIndicator
36
+ end
37
+
38
+ HealthOrchestrator --> Indicators
39
+ ```
40
+
41
+ The `HealthOrchestrator` aggregates all registered `IHealthIndicator` instances and returns a combined result. Each indicator reports its own key and status independently.
42
+
43
+ ## Prerequisites
44
+
45
+ - `@breadstone/archipel-platform-health` installed
46
+ - `@nestjs/terminus` installed (peer dependency)
47
+
48
+ ## IHealthIndicator Interface
49
+
50
+ Every health indicator implements this contract:
51
+
52
+ ```typescript
53
+ interface IHealthIndicator {
54
+ /** Unique key identifying this indicator in the health response. */
55
+ readonly key: string;
56
+
57
+ /** Run the health check and return a Terminus HealthIndicatorResult. */
58
+ check(): HealthIndicatorResult | Promise<HealthIndicatorResult>;
59
+ }
60
+ ```
61
+
62
+ ## Available Indicators
63
+
64
+ All 12 platform libraries provide a health indicator via their `/health` subpath:
65
+
66
+ | Library | Subpath Import | Class | Key | Check Behavior |
67
+ | ------- | -------------- | ----- | --- | -------------- |
68
+ | `platform-database` | `@breadstone/archipel-platform-database/health` | `DatabaseHealthIndicator` | `database` | Prisma `SELECT 1` ping |
69
+ | `platform-blob-storage` | `@breadstone/archipel-platform-blob-storage/health` | `BlobHealthIndicator` | `blob` | HTTP ping to blob URL (or `disabled` if unconfigured) |
70
+ | `platform-mailing` | `@breadstone/archipel-platform-mailing/health` | `MailHealthIndicator` | `mail` | Validates mail host, user, and port config |
71
+ | `platform-caching` | `@breadstone/archipel-platform-caching/health` | `CachingHealthIndicator` | `caching` | Always `up` |
72
+ | `platform-queue` | `@breadstone/archipel-platform-queue/health` | `QueueHealthIndicator` | `queue` | Always `up` |
73
+ | `platform-payments` | `@breadstone/archipel-platform-payments/health` | `PaymentHealthIndicator` | `payment` | Calls `PaymentClientPort.ping()` to verify provider connectivity |
74
+ | `platform-esigning` | `@breadstone/archipel-platform-esigning/health` | `EsigningHealthIndicator` | `esigning` | Calls `EsigningClientPort.ping()` to verify provider connectivity, reports `providerId` |
75
+ | `platform-intelligence` | `@breadstone/archipel-platform-intelligence/health` | `IntelligenceHealthIndicator` | `intelligence` | Checks `list().length > 0` on the capability registry, reports count |
76
+ | `platform-analytics` | `@breadstone/archipel-platform-analytics/health` | `AnalyticsHealthIndicator` | `analytics` | Calls `AnalyticsClientPort.ping()` to verify provider readiness |
77
+ | `platform-telemetry` | `@breadstone/archipel-platform-telemetry/health` | `TelemetryHealthIndicator` | `telemetry` | Checks `OtelSdkHolder.isInitialized` for SDK presence |
78
+ | `platform-authentication` | `@breadstone/archipel-platform-authentication/health` | `AuthenticationHealthIndicator` | `authentication` | Always `up` |
79
+ | `platform-mcp` | `@breadstone/archipel-platform-mcp/health` | `McpHealthIndicator` | `mcp` | Checks tool/resource/prompt registry counts, reports breakdown |
80
+
81
+ ### Indicator Categories
82
+
83
+ **Active checks** — perform a real probe:
84
+ - `DatabaseHealthIndicator` — executes a SQL ping
85
+ - `BlobHealthIndicator` — sends an HTTP request to the blob URL
86
+ - `MailHealthIndicator` — validates configuration values
87
+ - `PaymentHealthIndicator` — calls `PaymentClientPort.ping()` (adapters can override for real API calls)
88
+ - `EsigningHealthIndicator` — calls `EsigningClientPort.ping()` (adapters can override for real API calls)
89
+ - `AnalyticsHealthIndicator` — calls `AnalyticsClientPort.ping()` (adapters can override for SDK readiness checks)
90
+
91
+ **State checks** — inspect in-memory state (zero-cost, no I/O):
92
+ - `IntelligenceHealthIndicator` — verifies at least one capability is registered
93
+ - `TelemetryHealthIndicator` — checks whether the OpenTelemetry SDK has been initialized
94
+ - `McpHealthIndicator` — verifies at least one tool/resource/prompt handler is registered
95
+
96
+ **Stub checks** — always report `up`:
97
+ - `CachingHealthIndicator`, `QueueHealthIndicator`, `AuthenticationHealthIndicator`
98
+
99
+ ## Quick Start
100
+
101
+ ### 1. Register Indicators
102
+
103
+ Use `HealthModule.withIndicators()` to register the indicators you need:
104
+
105
+ ```typescript
106
+ import { Module } from '@nestjs/common';
107
+ import { HealthModule } from '@breadstone/archipel-platform-health';
108
+ import { DatabaseHealthIndicator } from '@breadstone/archipel-platform-database/health';
109
+ import { MailHealthIndicator } from '@breadstone/archipel-platform-mailing/health';
110
+ import { PaymentHealthIndicator } from '@breadstone/archipel-platform-payments/health';
111
+ import { CachingHealthIndicator } from '@breadstone/archipel-platform-caching/health';
112
+
113
+ @Module({
114
+ imports: [
115
+ // ... your feature modules
116
+ HealthModule.withIndicators([
117
+ DatabaseHealthIndicator,
118
+ MailHealthIndicator,
119
+ PaymentHealthIndicator,
120
+ CachingHealthIndicator,
121
+ ]),
122
+ ],
123
+ })
124
+ export class AppModule {}
125
+ ```
126
+
127
+ ### 2. Expose a Health Endpoint
128
+
129
+ The `HealthOrchestrator` runs all registered indicators and returns an aggregated result:
130
+
131
+ ```typescript
132
+ import { Controller, Get } from '@nestjs/common';
133
+ import { HealthOrchestrator } from '@breadstone/archipel-platform-health';
134
+
135
+ @Controller('health')
136
+ export class HealthController {
137
+ constructor(private readonly _health: HealthOrchestrator) {}
138
+
139
+ @Get()
140
+ public async check() {
141
+ return this._health.check();
142
+ }
143
+ }
144
+ ```
145
+
146
+ ### 3. Example Response
147
+
148
+ ```json
149
+ {
150
+ "status": "ok",
151
+ "details": {
152
+ "database": { "status": "up" },
153
+ "mail": { "status": "up" },
154
+ "payment": { "status": "up" },
155
+ "caching": { "status": "up" },
156
+ "intelligence": { "status": "up", "registeredCapabilities": 3 },
157
+ "mcp": { "status": "up", "tools": 5, "resources": 2, "prompts": 1 },
158
+ "telemetry": { "status": "up", "sdkInitialized": true }
159
+ }
160
+ }
161
+ ```
162
+
163
+ When a provider is not registered (e.g., no `PaymentClientPort` injected), the indicator reports:
164
+
165
+ ```json
166
+ {
167
+ "payment": { "status": "up", "disabled": true }
168
+ }
169
+ ```
170
+
171
+ When a ping fails, the indicator reports `down` with error details:
172
+
173
+ ```json
174
+ {
175
+ "payment": { "status": "down", "error": "ECONNREFUSED" }
176
+ }
177
+ ```
178
+
179
+ ## Writing a Custom Indicator
180
+
181
+ Implement `IHealthIndicator` to create a health check for your own services:
182
+
183
+ ```typescript
184
+ import { Injectable } from '@nestjs/common';
185
+ import { IHealthIndicator } from '@breadstone/archipel-platform-health';
186
+ import type { HealthIndicatorResult } from '@nestjs/terminus';
187
+
188
+ @Injectable()
189
+ export class SearchHealthIndicator implements IHealthIndicator {
190
+ public readonly key = 'search';
191
+
192
+ public check(): HealthIndicatorResult<'search'> {
193
+ return { search: { status: 'up' } };
194
+ }
195
+ }
196
+ ```
197
+
198
+ Register it alongside built-in indicators:
199
+
200
+ ```typescript
201
+ HealthModule.withIndicators([
202
+ DatabaseHealthIndicator,
203
+ SearchHealthIndicator,
204
+ ]);
205
+ ```
206
+
207
+ ## Tree-Shaking
208
+
209
+ Health indicators are **not** included in the main library entry point. They are exported from a separate `/health` subpath, so they are fully tree-shakeable. If you don't import the health subpath, the indicator code and its `@nestjs/terminus` peer dependency are never bundled.
210
+
211
+ ## Peer Dependencies
212
+
213
+ Each health indicator requires these optional peer dependencies:
214
+
215
+ | Package | Notes |
216
+ | ------- | ----- |
217
+ | `@breadstone/archipel-platform-health` | `IHealthIndicator` interface and `HealthModule` |
218
+ | `@nestjs/terminus` | `HealthIndicatorResult` type |
219
+
220
+ Both are listed as optional peer dependencies in each library's `package.json`.
@@ -52,6 +52,8 @@ Practical guides for working with Archipel packages in your NestJS application.
52
52
  | [Telemetry & Observability](./telemetry-and-observability) | OpenTelemetry metrics, distributed tracing, and structured logging. |
53
53
  | [Analytics & Error Tracking](./analytics-and-error-tracking) | Capture errors and user context with Sentry, AppInsights, or Datadog. |
54
54
  | [Caching](./caching) | In-memory LRU and Redis layered caches with TTL, stale-while-revalidate, and metrics. |
55
+ | [Queue Infrastructure](./queue-infrastructure) | In-memory FIFO, BullMQ (Redis), and Azure Service Bus job queues. |
56
+ | [Health Indicators](./health-indicators) | Integrate health checks from all platform libraries using the unified health architecture. |
55
57
 
56
58
  ## AI & Extensibility
57
59