@lssm/lib.contracts 0.0.0-canary-20251217063201 → 0.0.0-canary-20251217073102
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.
- package/dist/app-config/app-config.feature.js +53 -1
- package/dist/app-config/contracts.d.ts +50 -50
- package/dist/app-config/contracts.js +396 -1
- package/dist/app-config/docs/app-config.docblock.js +22 -220
- package/dist/app-config/events.d.ts +27 -27
- package/dist/app-config/events.js +168 -1
- package/dist/app-config/index.js +8 -1
- package/dist/app-config/lifecycle-contracts.d.ts +80 -80
- package/dist/app-config/lifecycle-contracts.js +441 -1
- package/dist/app-config/runtime.js +617 -1
- package/dist/app-config/spec.js +36 -1
- package/dist/app-config/validation.js +538 -1
- package/dist/capabilities/docs/capabilities.docblock.js +22 -1
- package/dist/capabilities/openbanking.js +92 -1
- package/dist/capabilities.js +50 -1
- package/dist/client/index.js +9 -1
- package/dist/client/react/drivers/rn-reusables.js +21 -1
- package/dist/client/react/drivers/shadcn.js +11 -1
- package/dist/client/react/feature-render.js +43 -1
- package/dist/client/react/form-render.js +298 -1
- package/dist/client/react/index.js +8 -1
- package/dist/contract-registry/index.js +3 -1
- package/dist/contract-registry/schemas.js +61 -1
- package/dist/contracts-adapter-hydration.js +41 -1
- package/dist/contracts-adapter-input.js +77 -1
- package/dist/data-views/docs/data-views.docblock.js +22 -1
- package/dist/data-views/query-generator.js +48 -1
- package/dist/data-views/runtime.js +39 -1
- package/dist/data-views.js +35 -1
- package/dist/docs/PUBLISHING.docblock.js +17 -76
- package/dist/docs/accessibility_wcag_compliance_specs.docblock.js +17 -350
- package/dist/docs/index.js +33 -1
- package/dist/docs/meta.docs.js +15 -2
- package/dist/docs/presentations.js +77 -1
- package/dist/docs/registry.js +51 -1
- package/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +17 -383
- package/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +17 -68
- package/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +17 -140
- package/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +17 -86
- package/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +17 -1
- package/dist/docs/tech/auth/better-auth-nextjs.docblock.js +25 -2
- package/dist/docs/tech/contracts/README.docblock.js +21 -1
- package/dist/docs/tech/contracts/create-subscription.docblock.js +21 -1
- package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.js +21 -180
- package/dist/docs/tech/contracts/migrations.docblock.js +21 -1
- package/dist/docs/tech/contracts/openapi-export.docblock.js +22 -2
- package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.js +19 -60
- package/dist/docs/tech/contracts/overlays.docblock.js +21 -68
- package/dist/docs/tech/contracts/tests.docblock.js +21 -132
- package/dist/docs/tech/contracts/themes.docblock.js +21 -1
- package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.js +21 -106
- package/dist/docs/tech/lifecycle-stage-system.docblock.js +17 -213
- package/dist/docs/tech/llm/llm-integration.docblock.js +74 -5
- package/dist/docs/tech/mcp-endpoints.docblock.js +38 -1
- package/dist/docs/tech/presentation-runtime.docblock.js +17 -1
- package/dist/docs/tech/schema/README.docblock.js +21 -262
- package/dist/docs/tech/studio/learning-events.docblock.js +49 -1
- package/dist/docs/tech/studio/learning-journeys.docblock.js +25 -2
- package/dist/docs/tech/studio/platform-admin-panel.docblock.js +24 -2
- package/dist/docs/tech/studio/project-access-teams.docblock.js +26 -16
- package/dist/docs/tech/studio/project-routing.docblock.js +68 -1
- package/dist/docs/tech/studio/sandbox-unlogged.docblock.js +23 -2
- package/dist/docs/tech/studio/team-invitations.docblock.js +41 -36
- package/dist/docs/tech/studio/workspace-ops.docblock.js +48 -1
- package/dist/docs/tech/studio/workspaces.docblock.js +24 -2
- package/dist/docs/tech/telemetry-ingest.docblock.js +37 -3
- package/dist/docs/tech/templates/runtime.docblock.js +21 -1
- package/dist/docs/tech/vscode-extension.docblock.js +37 -3
- package/dist/docs/tech/workflows/overview.docblock.js +21 -1
- package/dist/docs/tech-contracts.docs.js +19 -2
- package/dist/events.js +12 -1
- package/dist/experiments/docs/experiments.docblock.js +22 -128
- package/dist/experiments/evaluator.js +101 -1
- package/dist/experiments/spec.js +33 -1
- package/dist/features.js +68 -1
- package/dist/forms/docs/forms.docblock.js +22 -1
- package/dist/forms.js +119 -1
- package/dist/index.js +107 -1
- package/dist/install.js +40 -1
- package/dist/integrations/contracts.d.ts +102 -102
- package/dist/integrations/contracts.js +388 -1
- package/dist/integrations/docs/integrations.docblock.js +95 -1
- package/dist/integrations/health.js +69 -1
- package/dist/integrations/index.js +23 -1
- package/dist/integrations/openbanking/contracts/accounts.d.ts +66 -66
- package/dist/integrations/openbanking/contracts/accounts.js +237 -1
- package/dist/integrations/openbanking/contracts/balances.d.ts +34 -34
- package/dist/integrations/openbanking/contracts/balances.js +167 -1
- package/dist/integrations/openbanking/contracts/index.js +12 -1
- package/dist/integrations/openbanking/contracts/transactions.d.ts +48 -48
- package/dist/integrations/openbanking/contracts/transactions.js +218 -1
- package/dist/integrations/openbanking/guards.js +32 -1
- package/dist/integrations/openbanking/models.d.ts +55 -55
- package/dist/integrations/openbanking/models.js +242 -1
- package/dist/integrations/openbanking/openbanking.feature.js +68 -1
- package/dist/integrations/openbanking/telemetry.js +39 -1
- package/dist/integrations/providers/elevenlabs.js +56 -1
- package/dist/integrations/providers/gcs-storage.js +79 -1
- package/dist/integrations/providers/gmail.js +91 -1
- package/dist/integrations/providers/google-calendar.js +70 -1
- package/dist/integrations/providers/impls/elevenlabs-voice.js +95 -1
- package/dist/integrations/providers/impls/gcs-storage.js +88 -1
- package/dist/integrations/providers/impls/gmail-inbound.js +200 -1
- package/dist/integrations/providers/impls/gmail-outbound.js +104 -5
- package/dist/integrations/providers/impls/google-calendar.js +154 -1
- package/dist/integrations/providers/impls/index.js +16 -1
- package/dist/integrations/providers/impls/mistral-embedding.js +41 -1
- package/dist/integrations/providers/impls/mistral-llm.js +247 -1
- package/dist/integrations/providers/impls/postmark-email.js +55 -1
- package/dist/integrations/providers/impls/powens-client.js +171 -1
- package/dist/integrations/providers/impls/powens-openbanking.js +218 -1
- package/dist/integrations/providers/impls/provider-factory.js +142 -1
- package/dist/integrations/providers/impls/qdrant-vector.js +69 -1
- package/dist/integrations/providers/impls/stripe-payments.js +202 -1
- package/dist/integrations/providers/impls/twilio-sms.js +58 -1
- package/dist/integrations/providers/index.js +13 -1
- package/dist/integrations/providers/mistral.js +72 -1
- package/dist/integrations/providers/postmark.js +72 -1
- package/dist/integrations/providers/powens.js +120 -1
- package/dist/integrations/providers/qdrant.js +77 -1
- package/dist/integrations/providers/registry.js +34 -1
- package/dist/integrations/providers/stripe.js +87 -1
- package/dist/integrations/providers/twilio-sms.js +65 -1
- package/dist/integrations/runtime.js +186 -1
- package/dist/integrations/secrets/aws-secret-manager.js +231 -1
- package/dist/integrations/secrets/env-secret-provider.js +81 -1
- package/dist/integrations/secrets/gcp-secret-manager.js +229 -1
- package/dist/integrations/secrets/index.js +8 -1
- package/dist/integrations/secrets/manager.js +103 -1
- package/dist/integrations/secrets/provider.js +58 -1
- package/dist/integrations/secrets/scaleway-secret-manager.js +247 -1
- package/dist/integrations/spec.js +39 -1
- package/dist/jobs/define-job.js +16 -1
- package/dist/jobs/gcp-cloud-tasks.js +53 -1
- package/dist/jobs/gcp-pubsub.js +39 -1
- package/dist/jobs/handlers/gmail-sync-handler.js +9 -1
- package/dist/jobs/handlers/index.js +12 -1
- package/dist/jobs/handlers/ping-handler.js +15 -1
- package/dist/jobs/handlers/storage-document-handler.js +14 -1
- package/dist/jobs/index.js +4 -1
- package/dist/jobs/memory-queue.js +71 -1
- package/dist/jobs/queue.js +33 -1
- package/dist/jobs/scaleway-sqs-queue.js +153 -1
- package/dist/jsonschema.d.ts +3 -3
- package/dist/jsonschema.js +32 -1
- package/dist/knowledge/contracts.d.ts +66 -66
- package/dist/knowledge/contracts.js +317 -1
- package/dist/knowledge/docs/knowledge.docblock.js +22 -138
- package/dist/knowledge/index.js +10 -1
- package/dist/knowledge/ingestion/document-processor.js +54 -1
- package/dist/knowledge/ingestion/embedding-service.js +25 -1
- package/dist/knowledge/ingestion/gmail-adapter.js +50 -5
- package/dist/knowledge/ingestion/index.js +7 -1
- package/dist/knowledge/ingestion/storage-adapter.js +26 -1
- package/dist/knowledge/ingestion/vector-indexer.js +32 -1
- package/dist/knowledge/query/index.js +3 -1
- package/dist/knowledge/query/service.js +64 -2
- package/dist/knowledge/runtime.js +49 -1
- package/dist/knowledge/spaces/email-threads.js +38 -1
- package/dist/knowledge/spaces/financial-docs.js +38 -1
- package/dist/knowledge/spaces/financial-overview.js +42 -1
- package/dist/knowledge/spaces/index.js +8 -1
- package/dist/knowledge/spaces/product-canon.js +38 -1
- package/dist/knowledge/spaces/support-faq.js +41 -1
- package/dist/knowledge/spaces/uploaded-docs.js +38 -1
- package/dist/knowledge/spec.js +39 -1
- package/dist/llm/exporters.js +541 -8
- package/dist/llm/index.js +4 -1
- package/dist/llm/prompts.js +246 -56
- package/dist/markdown.js +116 -3
- package/dist/migrations.js +33 -1
- package/dist/onboarding-base.d.ts +29 -29
- package/dist/onboarding-base.js +196 -1
- package/dist/openapi.js +75 -1
- package/dist/openbanking/docs/openbanking.docblock.js +22 -109
- package/dist/ownership.js +40 -1
- package/dist/policy/docs/policy.docblock.js +22 -1
- package/dist/policy/engine.js +223 -1
- package/dist/policy/opa-adapter.js +71 -1
- package/dist/policy/spec.js +33 -1
- package/dist/presentations/docs/presentations-conventions.docblock.js +21 -7
- package/dist/presentations.backcompat.js +47 -1
- package/dist/presentations.d.ts +3 -3
- package/dist/presentations.js +66 -1
- package/dist/presentations.v2.js +278 -6
- package/dist/prompt.js +10 -1
- package/dist/promptRegistry.js +34 -1
- package/dist/regenerator/docs/regenerator.docblock.js +22 -184
- package/dist/regenerator/executor.js +86 -1
- package/dist/regenerator/index.js +6 -1
- package/dist/regenerator/service.js +92 -1
- package/dist/regenerator/sinks.js +32 -1
- package/dist/regenerator/utils.js +51 -1
- package/dist/registry.js +208 -1
- package/dist/resources.js +47 -1
- package/dist/schema/dist/EnumType.js +2 -1
- package/dist/schema/dist/FieldType.js +49 -1
- package/dist/schema/dist/ScalarTypeEnum.js +236 -1
- package/dist/schema/dist/SchemaModel.js +39 -1
- package/dist/schema/dist/entity/defineEntity.js +1 -1
- package/dist/schema/dist/entity/index.js +2 -1
- package/dist/schema/dist/entity/types.js +1 -1
- package/dist/schema/dist/index.js +6 -1
- package/dist/schema-to-markdown.js +214 -10
- package/dist/server/graphql-pothos.js +128 -1
- package/dist/server/index.js +10 -1
- package/dist/server/mcp/createMcpServer.js +28 -1
- package/dist/server/mcp/registerPresentations.js +151 -1
- package/dist/server/mcp/registerPrompts.js +36 -2
- package/dist/server/mcp/registerResources.js +35 -1
- package/dist/server/mcp/registerTools.js +22 -1
- package/dist/server/provider-mcp.js +3 -1
- package/dist/server/rest-elysia.js +20 -1
- package/dist/server/rest-express.js +39 -1
- package/dist/server/rest-generic.js +125 -1
- package/dist/server/rest-next-app.js +38 -1
- package/dist/server/rest-next-mcp.js +45 -1
- package/dist/server/rest-next-pages.js +25 -1
- package/dist/spec.js +35 -1
- package/dist/telemetry/anomaly.js +48 -1
- package/dist/telemetry/docs/telemetry.docblock.js +22 -139
- package/dist/telemetry/index.js +5 -1
- package/dist/telemetry/spec.js +69 -1
- package/dist/telemetry/tracker.js +76 -1
- package/dist/tests/index.js +4 -1
- package/dist/tests/runner.js +150 -1
- package/dist/tests/spec.js +33 -1
- package/dist/themes.js +39 -1
- package/dist/workflow/adapters/db-adapter.js +83 -1
- package/dist/workflow/adapters/file-adapter.js +11 -1
- package/dist/workflow/adapters/index.js +5 -1
- package/dist/workflow/adapters/memory-store.js +58 -1
- package/dist/workflow/expression.js +98 -1
- package/dist/workflow/index.js +9 -1
- package/dist/workflow/runner.js +337 -1
- package/dist/workflow/sla-monitor.js +47 -1
- package/dist/workflow/spec.js +32 -1
- package/dist/workflow/validation.js +175 -1
- package/package.json +11 -4
|
@@ -1 +1,388 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import { ScalarTypeEnum } from "../schema/dist/ScalarTypeEnum.js";
|
|
2
|
+
import { SchemaModel } from "../schema/dist/SchemaModel.js";
|
|
3
|
+
import "../schema/dist/index.js";
|
|
4
|
+
import { defineCommand, defineQuery } from "../spec.js";
|
|
5
|
+
|
|
6
|
+
//#region src/integrations/contracts.ts
|
|
7
|
+
const IntegrationConnectionRecord = new SchemaModel({
|
|
8
|
+
name: "IntegrationConnectionRecord",
|
|
9
|
+
fields: {
|
|
10
|
+
id: {
|
|
11
|
+
type: ScalarTypeEnum.ID(),
|
|
12
|
+
isOptional: false
|
|
13
|
+
},
|
|
14
|
+
tenantId: {
|
|
15
|
+
type: ScalarTypeEnum.ID(),
|
|
16
|
+
isOptional: false
|
|
17
|
+
},
|
|
18
|
+
integrationKey: {
|
|
19
|
+
type: ScalarTypeEnum.NonEmptyString(),
|
|
20
|
+
isOptional: false
|
|
21
|
+
},
|
|
22
|
+
integrationVersion: {
|
|
23
|
+
type: ScalarTypeEnum.Int_unsecure(),
|
|
24
|
+
isOptional: false
|
|
25
|
+
},
|
|
26
|
+
label: {
|
|
27
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
28
|
+
isOptional: false
|
|
29
|
+
},
|
|
30
|
+
ownershipMode: {
|
|
31
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
32
|
+
isOptional: false
|
|
33
|
+
},
|
|
34
|
+
externalAccountId: {
|
|
35
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
36
|
+
isOptional: true
|
|
37
|
+
},
|
|
38
|
+
secretProvider: {
|
|
39
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
40
|
+
isOptional: false
|
|
41
|
+
},
|
|
42
|
+
secretRef: {
|
|
43
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
44
|
+
isOptional: false
|
|
45
|
+
},
|
|
46
|
+
status: {
|
|
47
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
48
|
+
isOptional: false
|
|
49
|
+
},
|
|
50
|
+
environment: {
|
|
51
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
52
|
+
isOptional: true
|
|
53
|
+
},
|
|
54
|
+
healthStatus: {
|
|
55
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
56
|
+
isOptional: true
|
|
57
|
+
},
|
|
58
|
+
healthCheckedAt: {
|
|
59
|
+
type: ScalarTypeEnum.DateTime(),
|
|
60
|
+
isOptional: true
|
|
61
|
+
},
|
|
62
|
+
healthLatencyMs: {
|
|
63
|
+
type: ScalarTypeEnum.Float_unsecure(),
|
|
64
|
+
isOptional: true
|
|
65
|
+
},
|
|
66
|
+
healthErrorCode: {
|
|
67
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
68
|
+
isOptional: true
|
|
69
|
+
},
|
|
70
|
+
healthErrorMessage: {
|
|
71
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
72
|
+
isOptional: true
|
|
73
|
+
},
|
|
74
|
+
usageRequestCount: {
|
|
75
|
+
type: ScalarTypeEnum.Int_unsecure(),
|
|
76
|
+
isOptional: true
|
|
77
|
+
},
|
|
78
|
+
usageSuccessCount: {
|
|
79
|
+
type: ScalarTypeEnum.Int_unsecure(),
|
|
80
|
+
isOptional: true
|
|
81
|
+
},
|
|
82
|
+
usageErrorCount: {
|
|
83
|
+
type: ScalarTypeEnum.Int_unsecure(),
|
|
84
|
+
isOptional: true
|
|
85
|
+
},
|
|
86
|
+
usageLastUsedAt: {
|
|
87
|
+
type: ScalarTypeEnum.DateTime(),
|
|
88
|
+
isOptional: true
|
|
89
|
+
},
|
|
90
|
+
usageLastErrorAt: {
|
|
91
|
+
type: ScalarTypeEnum.DateTime(),
|
|
92
|
+
isOptional: true
|
|
93
|
+
},
|
|
94
|
+
usageLastErrorCode: {
|
|
95
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
96
|
+
isOptional: true
|
|
97
|
+
},
|
|
98
|
+
createdAt: {
|
|
99
|
+
type: ScalarTypeEnum.DateTime(),
|
|
100
|
+
isOptional: true
|
|
101
|
+
},
|
|
102
|
+
updatedAt: {
|
|
103
|
+
type: ScalarTypeEnum.DateTime(),
|
|
104
|
+
isOptional: true
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
const CreateIntegrationConnectionInput = new SchemaModel({
|
|
109
|
+
name: "CreateIntegrationConnectionInput",
|
|
110
|
+
fields: {
|
|
111
|
+
tenantId: {
|
|
112
|
+
type: ScalarTypeEnum.ID(),
|
|
113
|
+
isOptional: false
|
|
114
|
+
},
|
|
115
|
+
integrationKey: {
|
|
116
|
+
type: ScalarTypeEnum.NonEmptyString(),
|
|
117
|
+
isOptional: false
|
|
118
|
+
},
|
|
119
|
+
integrationVersion: {
|
|
120
|
+
type: ScalarTypeEnum.Int_unsecure(),
|
|
121
|
+
isOptional: false
|
|
122
|
+
},
|
|
123
|
+
label: {
|
|
124
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
125
|
+
isOptional: false
|
|
126
|
+
},
|
|
127
|
+
ownershipMode: {
|
|
128
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
129
|
+
isOptional: false
|
|
130
|
+
},
|
|
131
|
+
externalAccountId: {
|
|
132
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
133
|
+
isOptional: true
|
|
134
|
+
},
|
|
135
|
+
secretProvider: {
|
|
136
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
137
|
+
isOptional: false
|
|
138
|
+
},
|
|
139
|
+
secretRef: {
|
|
140
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
141
|
+
isOptional: false
|
|
142
|
+
},
|
|
143
|
+
environment: {
|
|
144
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
145
|
+
isOptional: true
|
|
146
|
+
},
|
|
147
|
+
config: {
|
|
148
|
+
type: ScalarTypeEnum.JSONObject(),
|
|
149
|
+
isOptional: false
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
const UpdateIntegrationConnectionInput = new SchemaModel({
|
|
154
|
+
name: "UpdateIntegrationConnectionInput",
|
|
155
|
+
fields: {
|
|
156
|
+
connectionId: {
|
|
157
|
+
type: ScalarTypeEnum.ID(),
|
|
158
|
+
isOptional: false
|
|
159
|
+
},
|
|
160
|
+
label: {
|
|
161
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
162
|
+
isOptional: true
|
|
163
|
+
},
|
|
164
|
+
status: {
|
|
165
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
166
|
+
isOptional: true
|
|
167
|
+
},
|
|
168
|
+
ownershipMode: {
|
|
169
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
170
|
+
isOptional: true
|
|
171
|
+
},
|
|
172
|
+
externalAccountId: {
|
|
173
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
174
|
+
isOptional: true
|
|
175
|
+
},
|
|
176
|
+
secretProvider: {
|
|
177
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
178
|
+
isOptional: true
|
|
179
|
+
},
|
|
180
|
+
secretRef: {
|
|
181
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
182
|
+
isOptional: true
|
|
183
|
+
},
|
|
184
|
+
config: {
|
|
185
|
+
type: ScalarTypeEnum.JSONObject(),
|
|
186
|
+
isOptional: true
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
const DeleteIntegrationConnectionInput = new SchemaModel({
|
|
191
|
+
name: "DeleteIntegrationConnectionInput",
|
|
192
|
+
fields: { connectionId: {
|
|
193
|
+
type: ScalarTypeEnum.ID(),
|
|
194
|
+
isOptional: false
|
|
195
|
+
} }
|
|
196
|
+
});
|
|
197
|
+
const ListIntegrationConnectionsInput = new SchemaModel({
|
|
198
|
+
name: "ListIntegrationConnectionsInput",
|
|
199
|
+
fields: {
|
|
200
|
+
tenantId: {
|
|
201
|
+
type: ScalarTypeEnum.ID(),
|
|
202
|
+
isOptional: false
|
|
203
|
+
},
|
|
204
|
+
category: {
|
|
205
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
206
|
+
isOptional: true
|
|
207
|
+
},
|
|
208
|
+
status: {
|
|
209
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
210
|
+
isOptional: true
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
const ListIntegrationConnectionsOutput = new SchemaModel({
|
|
215
|
+
name: "ListIntegrationConnectionsOutput",
|
|
216
|
+
fields: { connections: {
|
|
217
|
+
type: IntegrationConnectionRecord,
|
|
218
|
+
isOptional: false,
|
|
219
|
+
isArray: true
|
|
220
|
+
} }
|
|
221
|
+
});
|
|
222
|
+
const TestIntegrationConnectionInput = new SchemaModel({
|
|
223
|
+
name: "TestIntegrationConnectionInput",
|
|
224
|
+
fields: { connectionId: {
|
|
225
|
+
type: ScalarTypeEnum.ID(),
|
|
226
|
+
isOptional: false
|
|
227
|
+
} }
|
|
228
|
+
});
|
|
229
|
+
const TestIntegrationConnectionOutput = new SchemaModel({
|
|
230
|
+
name: "TestIntegrationConnectionOutput",
|
|
231
|
+
fields: {
|
|
232
|
+
success: {
|
|
233
|
+
type: ScalarTypeEnum.Boolean(),
|
|
234
|
+
isOptional: false
|
|
235
|
+
},
|
|
236
|
+
status: {
|
|
237
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
238
|
+
isOptional: true
|
|
239
|
+
},
|
|
240
|
+
latencyMs: {
|
|
241
|
+
type: ScalarTypeEnum.Float_unsecure(),
|
|
242
|
+
isOptional: true
|
|
243
|
+
},
|
|
244
|
+
error: {
|
|
245
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
246
|
+
isOptional: true
|
|
247
|
+
},
|
|
248
|
+
errorCode: {
|
|
249
|
+
type: ScalarTypeEnum.String_unsecure(),
|
|
250
|
+
isOptional: true
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
const DeleteIntegrationConnectionOutput = new SchemaModel({
|
|
255
|
+
name: "DeleteIntegrationConnectionOutput",
|
|
256
|
+
fields: { success: {
|
|
257
|
+
type: ScalarTypeEnum.Boolean(),
|
|
258
|
+
isOptional: false
|
|
259
|
+
} }
|
|
260
|
+
});
|
|
261
|
+
const CreateIntegrationConnection = defineCommand({
|
|
262
|
+
meta: {
|
|
263
|
+
name: "integrations.connection.create",
|
|
264
|
+
version: 1,
|
|
265
|
+
description: "Create a new integration connection for a tenant.",
|
|
266
|
+
goal: "Provision a tenant-scoped connection to an external provider.",
|
|
267
|
+
context: "Used by Ops or the App Studio to configure external integrations such as Stripe or Qdrant.",
|
|
268
|
+
owners: ["platform.integrations"],
|
|
269
|
+
tags: ["integration", "connections"],
|
|
270
|
+
stability: "experimental"
|
|
271
|
+
},
|
|
272
|
+
io: {
|
|
273
|
+
input: CreateIntegrationConnectionInput,
|
|
274
|
+
output: IntegrationConnectionRecord
|
|
275
|
+
},
|
|
276
|
+
policy: {
|
|
277
|
+
auth: "admin",
|
|
278
|
+
policies: [{
|
|
279
|
+
name: "platform.integration.manage",
|
|
280
|
+
version: 1
|
|
281
|
+
}]
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
const UpdateIntegrationConnection = defineCommand({
|
|
285
|
+
meta: {
|
|
286
|
+
name: "integrations.connection.update",
|
|
287
|
+
version: 1,
|
|
288
|
+
description: "Update metadata or credentials for an integration connection.",
|
|
289
|
+
goal: "Allow secure rotation of credentials and metadata adjustments.",
|
|
290
|
+
context: "Supports rotating API keys, toggling status, or updating labels for tenant integrations.",
|
|
291
|
+
owners: ["platform.integrations"],
|
|
292
|
+
tags: ["integration", "connections"],
|
|
293
|
+
stability: "experimental"
|
|
294
|
+
},
|
|
295
|
+
io: {
|
|
296
|
+
input: UpdateIntegrationConnectionInput,
|
|
297
|
+
output: IntegrationConnectionRecord
|
|
298
|
+
},
|
|
299
|
+
policy: {
|
|
300
|
+
auth: "admin",
|
|
301
|
+
policies: [{
|
|
302
|
+
name: "platform.integration.manage",
|
|
303
|
+
version: 1
|
|
304
|
+
}]
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
const DeleteIntegrationConnection = defineCommand({
|
|
308
|
+
meta: {
|
|
309
|
+
name: "integrations.connection.delete",
|
|
310
|
+
version: 1,
|
|
311
|
+
description: "Delete an integration connection for a tenant.",
|
|
312
|
+
goal: "Safely remove credentials and disable connector usage.",
|
|
313
|
+
context: "Ensures connections are de-provisioned when no longer needed or breached.",
|
|
314
|
+
owners: ["platform.integrations"],
|
|
315
|
+
tags: ["integration", "connections"],
|
|
316
|
+
stability: "experimental"
|
|
317
|
+
},
|
|
318
|
+
io: {
|
|
319
|
+
input: DeleteIntegrationConnectionInput,
|
|
320
|
+
output: DeleteIntegrationConnectionOutput
|
|
321
|
+
},
|
|
322
|
+
policy: {
|
|
323
|
+
auth: "admin",
|
|
324
|
+
policies: [{
|
|
325
|
+
name: "platform.integration.manage",
|
|
326
|
+
version: 1
|
|
327
|
+
}]
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
const ListIntegrationConnections = defineQuery({
|
|
331
|
+
meta: {
|
|
332
|
+
name: "integrations.connection.list",
|
|
333
|
+
version: 1,
|
|
334
|
+
description: "List integration connections for a tenant.",
|
|
335
|
+
goal: "Provide visibility into configured integrations and their status.",
|
|
336
|
+
context: "Used by the App Studio and Ops flows to show bindings and health.",
|
|
337
|
+
owners: ["platform.integrations"],
|
|
338
|
+
tags: ["integration", "connections"],
|
|
339
|
+
stability: "experimental"
|
|
340
|
+
},
|
|
341
|
+
io: {
|
|
342
|
+
input: ListIntegrationConnectionsInput,
|
|
343
|
+
output: ListIntegrationConnectionsOutput
|
|
344
|
+
},
|
|
345
|
+
policy: {
|
|
346
|
+
auth: "admin",
|
|
347
|
+
policies: [{
|
|
348
|
+
name: "platform.integration.read",
|
|
349
|
+
version: 1
|
|
350
|
+
}]
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
const TestIntegrationConnection = defineCommand({
|
|
354
|
+
meta: {
|
|
355
|
+
name: "integrations.connection.test",
|
|
356
|
+
version: 1,
|
|
357
|
+
description: "Run a health check against a configured integration connection.",
|
|
358
|
+
goal: "Validate credentials and connectivity for external providers.",
|
|
359
|
+
context: "Triggered manually or by background monitors to confirm provider availability.",
|
|
360
|
+
owners: ["platform.integrations"],
|
|
361
|
+
tags: ["integration", "connections"],
|
|
362
|
+
stability: "experimental"
|
|
363
|
+
},
|
|
364
|
+
io: {
|
|
365
|
+
input: TestIntegrationConnectionInput,
|
|
366
|
+
output: TestIntegrationConnectionOutput
|
|
367
|
+
},
|
|
368
|
+
policy: {
|
|
369
|
+
auth: "admin",
|
|
370
|
+
policies: [{
|
|
371
|
+
name: "platform.integration.manage",
|
|
372
|
+
version: 1
|
|
373
|
+
}]
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
const integrationContracts = {
|
|
377
|
+
CreateIntegrationConnection,
|
|
378
|
+
UpdateIntegrationConnection,
|
|
379
|
+
DeleteIntegrationConnection,
|
|
380
|
+
ListIntegrationConnections,
|
|
381
|
+
TestIntegrationConnection
|
|
382
|
+
};
|
|
383
|
+
function registerIntegrationContracts(registry) {
|
|
384
|
+
return registry.register(CreateIntegrationConnection).register(UpdateIntegrationConnection).register(DeleteIntegrationConnection).register(ListIntegrationConnections).register(TestIntegrationConnection);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
//#endregion
|
|
388
|
+
export { CreateIntegrationConnection, DeleteIntegrationConnection, ListIntegrationConnections, TestIntegrationConnection, UpdateIntegrationConnection, integrationContracts, registerIntegrationContracts };
|
|
@@ -1 +1,95 @@
|
|
|
1
|
-
import{registerDocBlocks
|
|
1
|
+
import { registerDocBlocks } from "../../docs/registry.js";
|
|
2
|
+
import "../../registry.js";
|
|
3
|
+
|
|
4
|
+
//#region src/integrations/docs/integrations.docblock.ts
|
|
5
|
+
const tech_contracts_integrations_DocBlocks = [{
|
|
6
|
+
id: "docs.tech.contracts.integrations",
|
|
7
|
+
title: "ContractSpec Integrations",
|
|
8
|
+
summary: "Provider-agnostic integration contracts: specs, connections, secrets, health checks, and runtime guards.",
|
|
9
|
+
kind: "reference",
|
|
10
|
+
visibility: "public",
|
|
11
|
+
route: "/docs/tech/contracts/integrations",
|
|
12
|
+
tags: [
|
|
13
|
+
"tech",
|
|
14
|
+
"contracts",
|
|
15
|
+
"integrations"
|
|
16
|
+
],
|
|
17
|
+
body: `# ContractSpec Integrations
|
|
18
|
+
|
|
19
|
+
This document describes the integration architecture that powers ContractSpec-based apps. It focuses on provider-agnostic contracts, secret management, health checks, and runtime guards.
|
|
20
|
+
|
|
21
|
+
## Core Concepts
|
|
22
|
+
|
|
23
|
+
- **IntegrationSpec** – declarative description of a provider that lists supported ownership modes, capability mappings, configuration schema, secret schema, health check policy, and documentation metadata.
|
|
24
|
+
- **IntegrationConnection** – tenant/environment binding to a provider (\`meta\` + ownership mode + config + \`secretRef\`). Secrets are never embedded in specs or configs.
|
|
25
|
+
- **AppIntegrationSlot** – blueprint-level requirement that declares which integration categories/capabilities must be satisfied at runtime (e.g. \`primaryLLM\`, \`primaryVectorDb\`).
|
|
26
|
+
- **AppIntegrationBinding** – tenant-level slot → connection mapping.
|
|
27
|
+
- **ResolvedIntegration** – runtime view containing slot metadata, connection details, and the resolved IntegrationSpec.
|
|
28
|
+
|
|
29
|
+
## Registered Providers
|
|
30
|
+
|
|
31
|
+
The contracts library ships ten priority providers in \`packages/libs/contracts/src/integrations/providers\`:
|
|
32
|
+
|
|
33
|
+
| Category | Provider | Key | Notes |
|
|
34
|
+
| ------------- | ---------------- | --------------------------- | ------------------------------------------------- |
|
|
35
|
+
| payments | Stripe | \`payments.stripe\` | Card + invoice flows, managed or BYOK credentials |
|
|
36
|
+
| email (out) | Postmark | \`email.postmark\` | Transactional email delivery |
|
|
37
|
+
| email (in) | Gmail API | \`email.gmail\` | Thread ingestion (OAuth BYOK or service account) |
|
|
38
|
+
| calendar | Google Calendar | \`calendar.google\` | Event scheduling via service account |
|
|
39
|
+
| vector-db | Qdrant | \`vectordb.qdrant\` | Embedding storage & search |
|
|
40
|
+
| storage | Google Cloud | \`storage.gcs\` | Object storage |
|
|
41
|
+
| ai-llm | Mistral | \`ai-llm.mistral\` | Primary chat + embedding provider |
|
|
42
|
+
| ai-voice | ElevenLabs | \`ai-voice.elevenlabs\` | Text-to-speech synthesis |
|
|
43
|
+
| sms | Twilio SMS | \`sms.twilio\` | Urgent and fallback reminders |
|
|
44
|
+
| open-banking | Powens | \`openbanking.powens\` | Read-only account, transaction, and balance sync |
|
|
45
|
+
|
|
46
|
+
Each provider ships with:
|
|
47
|
+
|
|
48
|
+
- Strongly typed adapter interfaces (\`payments.ts\`, \`llm.ts\`, etc.)
|
|
49
|
+
- A concrete SDK-backed implementation under \`providers/impls\`
|
|
50
|
+
- Unit tests validating adapter behaviour and health checks
|
|
51
|
+
|
|
52
|
+
### Canonical registry builder
|
|
53
|
+
|
|
54
|
+
To list all shipped specs at runtime, use:
|
|
55
|
+
|
|
56
|
+
- \`createDefaultIntegrationSpecRegistry()\` from \`@lssm/lib.contracts/integrations/providers/registry\`
|
|
57
|
+
|
|
58
|
+
## Secret Management
|
|
59
|
+
|
|
60
|
+
All integrations rely on the \`SecretProvider\` abstraction defined in \`integrations/secrets\`. Providers ship with the contracts library and are orchestrated by the \`SecretProviderManager\` composite:
|
|
61
|
+
|
|
62
|
+
- **EnvSecretProvider** (\`env-secret-provider.ts\`) – high-priority, read-only overrides backed by environment variables.
|
|
63
|
+
- Supports the \`env://VARIABLE_NAME\` scheme
|
|
64
|
+
- Supports overrides for other schemes via \`?env=ALIAS\` or derived uppercase keys
|
|
65
|
+
- **GcpSecretManagerProvider** (\`gcp-secret-manager.ts\`) – versioned secrets stored in Google Cloud Secret Manager.
|
|
66
|
+
- Example: \`gcp://projects/demo/secrets/stripe-key/versions/latest\`
|
|
67
|
+
- **AwsSecretsManagerProvider** (\`aws-secret-manager.ts\`) – AWS Secrets Manager backend.
|
|
68
|
+
- Example: \`aws://secretsmanager/eu-west-1/my-secret?version=AWSCURRENT\`
|
|
69
|
+
- Region may be in the reference or provided via \`AWS_REGION\` / \`AWS_DEFAULT_REGION\`
|
|
70
|
+
- **ScalewaySecretManagerProvider** (\`scaleway-secret-manager.ts\`) – Scaleway Secret Manager backend.
|
|
71
|
+
- Example (id): \`scw://secret-manager/fr-par/1234...-uuid?version=latest\`
|
|
72
|
+
- Example (name, create+write): \`scw://secret-manager/fr-par/my-secret-name\`
|
|
73
|
+
- Requires \`SCW_SECRET_KEY\` (token) and \`SCW_DEFAULT_PROJECT_ID\` when creating secrets by name
|
|
74
|
+
|
|
75
|
+
The manager attempts providers in priority order (environment first, then cloud providers). Key points:
|
|
76
|
+
|
|
77
|
+
- \`secretRef\` is a URI-like reference; raw secrets are never returned.
|
|
78
|
+
- \`IntegrationCallGuard\` fetches and parses secrets before executing a provider adapter.
|
|
79
|
+
- Local development can rely on \`.env\` files, while staging/production reference cloud secret stores.
|
|
80
|
+
|
|
81
|
+
## Health Checks & Telemetry
|
|
82
|
+
|
|
83
|
+
- Each IntegrationSpec optionally declares \`healthCheck.method\` and timeouts.
|
|
84
|
+
- \`IntegrationCallGuard\` enforces connection status, wraps retries with exponential back-off, and emits telemetry events tagged with tenant/app/slot metadata.
|
|
85
|
+
- Validation rules (\`app-config/validation.ts\`) surface issues at publish time (slot mismatch, unsupported ownership modes, missing capabilities, etc.).
|
|
86
|
+
|
|
87
|
+
## Studio persistence (ContractSpec Studio)
|
|
88
|
+
|
|
89
|
+
ContractSpec Studio persists tenant \`IntegrationConnection\` records in Postgres (Prisma model \`IntegrationConnection\` in \`@lssm/lib.database-contractspec-studio\`) and exposes a platform-admin management surface (see the Studio platform admin panel).
|
|
90
|
+
`
|
|
91
|
+
}];
|
|
92
|
+
registerDocBlocks(tech_contracts_integrations_DocBlocks);
|
|
93
|
+
|
|
94
|
+
//#endregion
|
|
95
|
+
export { tech_contracts_integrations_DocBlocks };
|
|
@@ -1 +1,69 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/integrations/health.ts
|
|
2
|
+
var IntegrationHealthService = class {
|
|
3
|
+
telemetry;
|
|
4
|
+
nowFn;
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.telemetry = options.telemetry;
|
|
7
|
+
this.nowFn = options.now ?? (() => /* @__PURE__ */ new Date());
|
|
8
|
+
}
|
|
9
|
+
async check(context, executor) {
|
|
10
|
+
const start = this.nowFn();
|
|
11
|
+
try {
|
|
12
|
+
await executor(context);
|
|
13
|
+
const end = this.nowFn();
|
|
14
|
+
const result = {
|
|
15
|
+
status: "connected",
|
|
16
|
+
checkedAt: end,
|
|
17
|
+
latencyMs: end.getTime() - start.getTime()
|
|
18
|
+
};
|
|
19
|
+
this.emitTelemetry(context, result, "success");
|
|
20
|
+
return result;
|
|
21
|
+
} catch (error) {
|
|
22
|
+
const end = this.nowFn();
|
|
23
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
24
|
+
const code = extractErrorCode(error);
|
|
25
|
+
const result = {
|
|
26
|
+
status: "error",
|
|
27
|
+
checkedAt: end,
|
|
28
|
+
latencyMs: end.getTime() - start.getTime(),
|
|
29
|
+
errorMessage: message,
|
|
30
|
+
errorCode: code
|
|
31
|
+
};
|
|
32
|
+
this.emitTelemetry(context, result, "error", code, message);
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
emitTelemetry(context, result, status, errorCode, errorMessage) {
|
|
37
|
+
if (!this.telemetry) return;
|
|
38
|
+
this.telemetry.record({
|
|
39
|
+
tenantId: context.tenantId,
|
|
40
|
+
appId: context.appId,
|
|
41
|
+
environment: context.environment,
|
|
42
|
+
slotId: context.slotId,
|
|
43
|
+
integrationKey: context.spec.meta.key,
|
|
44
|
+
integrationVersion: context.spec.meta.version,
|
|
45
|
+
connectionId: context.connection.meta.id,
|
|
46
|
+
status,
|
|
47
|
+
durationMs: result.latencyMs,
|
|
48
|
+
errorCode,
|
|
49
|
+
errorMessage,
|
|
50
|
+
occurredAt: result.checkedAt ?? this.nowFn(),
|
|
51
|
+
metadata: {
|
|
52
|
+
...context.trace ? {
|
|
53
|
+
blueprint: `${context.trace.blueprintName}.v${context.trace.blueprintVersion}`,
|
|
54
|
+
configVersion: context.trace.configVersion
|
|
55
|
+
} : {},
|
|
56
|
+
status: result.status
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
function extractErrorCode(error) {
|
|
62
|
+
if (!error || typeof error !== "object") return void 0;
|
|
63
|
+
const candidate = error;
|
|
64
|
+
if (candidate.code == null) return void 0;
|
|
65
|
+
return String(candidate.code);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
//#endregion
|
|
69
|
+
export { IntegrationHealthService };
|
|
@@ -1 +1,23 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { IntegrationSpecRegistry, makeIntegrationSpecKey } from "./spec.js";
|
|
2
|
+
import { registerStripeIntegration, stripeIntegrationSpec } from "./providers/stripe.js";
|
|
3
|
+
import { postmarkIntegrationSpec, registerPostmarkIntegration } from "./providers/postmark.js";
|
|
4
|
+
import { qdrantIntegrationSpec, registerQdrantIntegration } from "./providers/qdrant.js";
|
|
5
|
+
import { mistralIntegrationSpec, registerMistralIntegration } from "./providers/mistral.js";
|
|
6
|
+
import { elevenLabsIntegrationSpec, registerElevenLabsIntegration } from "./providers/elevenlabs.js";
|
|
7
|
+
import { gmailIntegrationSpec, registerGmailIntegration } from "./providers/gmail.js";
|
|
8
|
+
import { googleCalendarIntegrationSpec, registerGoogleCalendarIntegration } from "./providers/google-calendar.js";
|
|
9
|
+
import { registerTwilioSmsIntegration, twilioSmsIntegrationSpec } from "./providers/twilio-sms.js";
|
|
10
|
+
import { gcsStorageIntegrationSpec, registerGcsStorageIntegration } from "./providers/gcs-storage.js";
|
|
11
|
+
import { powensIntegrationSpec, registerPowensIntegration } from "./providers/powens.js";
|
|
12
|
+
import { createDefaultIntegrationSpecRegistry } from "./providers/registry.js";
|
|
13
|
+
import "./providers/index.js";
|
|
14
|
+
import { AccountBalanceRecord, BankAccountRecord, BankTransactionRecord } from "./openbanking/models.js";
|
|
15
|
+
import { OPENBANKING_PII_FIELDS, OPENBANKING_TELEMETRY_EVENTS, redactOpenBankingTelemetryPayload } from "./openbanking/telemetry.js";
|
|
16
|
+
import { OpenBankingGetAccount, OpenBankingListAccounts, OpenBankingSyncAccounts } from "./openbanking/contracts/accounts.js";
|
|
17
|
+
import { OpenBankingListTransactions, OpenBankingSyncTransactions } from "./openbanking/contracts/transactions.js";
|
|
18
|
+
import { OpenBankingGetBalances, OpenBankingRefreshBalances } from "./openbanking/contracts/balances.js";
|
|
19
|
+
import { OpenBankingFeature } from "./openbanking/openbanking.feature.js";
|
|
20
|
+
import { registerOpenBankingContracts } from "./openbanking/contracts/index.js";
|
|
21
|
+
import { assertPrimaryOpenBankingReady, ensurePrimaryOpenBankingIntegration } from "./openbanking/guards.js";
|
|
22
|
+
|
|
23
|
+
export { AccountBalanceRecord, BankAccountRecord, BankTransactionRecord, IntegrationSpecRegistry, OPENBANKING_PII_FIELDS, OPENBANKING_TELEMETRY_EVENTS, OpenBankingFeature, OpenBankingGetAccount, OpenBankingGetBalances, OpenBankingListAccounts, OpenBankingListTransactions, OpenBankingRefreshBalances, OpenBankingSyncAccounts, OpenBankingSyncTransactions, assertPrimaryOpenBankingReady, createDefaultIntegrationSpecRegistry, elevenLabsIntegrationSpec, ensurePrimaryOpenBankingIntegration, gcsStorageIntegrationSpec, gmailIntegrationSpec, googleCalendarIntegrationSpec, makeIntegrationSpecKey, mistralIntegrationSpec, postmarkIntegrationSpec, powensIntegrationSpec, qdrantIntegrationSpec, redactOpenBankingTelemetryPayload, registerElevenLabsIntegration, registerGcsStorageIntegration, registerGmailIntegration, registerGoogleCalendarIntegration, registerMistralIntegration, registerOpenBankingContracts, registerPostmarkIntegration, registerPowensIntegration, registerQdrantIntegration, registerStripeIntegration, registerTwilioSmsIntegration, stripeIntegrationSpec, twilioSmsIntegrationSpec };
|