@contractspec/example.integration-hub 1.56.1 → 1.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +9 -19
  2. package/dist/browser/connection/connection.enum.js +12 -0
  3. package/dist/browser/connection/connection.operation.js +101 -0
  4. package/dist/browser/connection/connection.presentation.js +99 -0
  5. package/dist/browser/connection/connection.schema.js +48 -0
  6. package/dist/browser/connection/index.js +104 -0
  7. package/dist/browser/docs/index.js +104 -0
  8. package/dist/browser/docs/integration-hub.docblock.js +104 -0
  9. package/dist/browser/events.js +211 -0
  10. package/dist/browser/example.js +42 -0
  11. package/dist/browser/handlers/index.js +246 -0
  12. package/dist/browser/handlers/integration.handlers.js +246 -0
  13. package/dist/browser/index.js +1595 -0
  14. package/dist/browser/integration/index.js +92 -0
  15. package/dist/browser/integration/integration.enum.js +12 -0
  16. package/dist/browser/integration/integration.operations.js +89 -0
  17. package/dist/browser/integration/integration.presentation.js +117 -0
  18. package/dist/browser/integration/integration.schema.js +42 -0
  19. package/dist/browser/integration-hub.capability.js +40 -0
  20. package/dist/browser/integration-hub.feature.js +114 -0
  21. package/dist/browser/seeders/index.js +60 -0
  22. package/dist/browser/sync/index.js +332 -0
  23. package/dist/browser/sync/sync.enum.js +26 -0
  24. package/dist/browser/sync/sync.operations.js +321 -0
  25. package/dist/browser/sync/sync.presentation.js +298 -0
  26. package/dist/browser/sync/sync.schema.js +154 -0
  27. package/dist/browser/sync-engine/index.js +186 -0
  28. package/dist/browser/tests/operations.test-spec.js +85 -0
  29. package/dist/browser/ui/IntegrationDashboard.js +369 -0
  30. package/dist/browser/ui/hooks/index.js +57 -0
  31. package/dist/browser/ui/hooks/useIntegrationData.js +54 -0
  32. package/dist/browser/ui/index.js +644 -0
  33. package/dist/browser/ui/renderers/index.js +273 -0
  34. package/dist/browser/ui/renderers/integration.markdown.js +273 -0
  35. package/dist/connection/connection.enum.d.ts +1 -6
  36. package/dist/connection/connection.enum.d.ts.map +1 -1
  37. package/dist/connection/connection.enum.js +11 -15
  38. package/dist/connection/connection.operation.d.ts +78 -84
  39. package/dist/connection/connection.operation.d.ts.map +1 -1
  40. package/dist/connection/connection.operation.js +99 -60
  41. package/dist/connection/connection.presentation.d.ts +2 -7
  42. package/dist/connection/connection.presentation.d.ts.map +1 -1
  43. package/dist/connection/connection.presentation.js +96 -56
  44. package/dist/connection/connection.schema.d.ts +54 -59
  45. package/dist/connection/connection.schema.d.ts.map +1 -1
  46. package/dist/connection/connection.schema.js +46 -73
  47. package/dist/connection/index.d.ts +7 -4
  48. package/dist/connection/index.d.ts.map +1 -0
  49. package/dist/connection/index.js +104 -4
  50. package/dist/docs/index.d.ts +2 -1
  51. package/dist/docs/index.d.ts.map +1 -0
  52. package/dist/docs/index.js +105 -1
  53. package/dist/docs/integration-hub.docblock.d.ts +2 -1
  54. package/dist/docs/integration-hub.docblock.d.ts.map +1 -0
  55. package/dist/docs/integration-hub.docblock.js +46 -56
  56. package/dist/events.d.ts +137 -143
  57. package/dist/events.d.ts.map +1 -1
  58. package/dist/events.js +210 -287
  59. package/dist/example.d.ts +2 -6
  60. package/dist/example.d.ts.map +1 -1
  61. package/dist/example.js +40 -55
  62. package/dist/handlers/index.d.ts +2 -2
  63. package/dist/handlers/index.d.ts.map +1 -0
  64. package/dist/handlers/index.js +247 -3
  65. package/dist/handlers/integration.handlers.d.ts +114 -114
  66. package/dist/handlers/integration.handlers.d.ts.map +1 -1
  67. package/dist/handlers/integration.handlers.js +232 -267
  68. package/dist/index.d.ts +12 -19
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +1596 -20
  71. package/dist/integration/index.d.ts +7 -4
  72. package/dist/integration/index.d.ts.map +1 -0
  73. package/dist/integration/index.js +92 -4
  74. package/dist/integration/integration.enum.d.ts +1 -6
  75. package/dist/integration/integration.enum.d.ts.map +1 -1
  76. package/dist/integration/integration.enum.js +11 -15
  77. package/dist/integration/integration.operations.d.ts +74 -80
  78. package/dist/integration/integration.operations.d.ts.map +1 -1
  79. package/dist/integration/integration.operations.js +87 -54
  80. package/dist/integration/integration.presentation.d.ts +3 -8
  81. package/dist/integration/integration.presentation.d.ts.map +1 -1
  82. package/dist/integration/integration.presentation.js +114 -73
  83. package/dist/integration/integration.schema.d.ts +54 -59
  84. package/dist/integration/integration.schema.d.ts.map +1 -1
  85. package/dist/integration/integration.schema.js +40 -73
  86. package/dist/integration-hub.capability.d.ts +3 -8
  87. package/dist/integration-hub.capability.d.ts.map +1 -1
  88. package/dist/integration-hub.capability.js +41 -38
  89. package/dist/integration-hub.feature.d.ts +1 -6
  90. package/dist/integration-hub.feature.d.ts.map +1 -1
  91. package/dist/integration-hub.feature.js +113 -242
  92. package/dist/node/connection/connection.enum.js +12 -0
  93. package/dist/node/connection/connection.operation.js +101 -0
  94. package/dist/node/connection/connection.presentation.js +99 -0
  95. package/dist/node/connection/connection.schema.js +48 -0
  96. package/dist/node/connection/index.js +104 -0
  97. package/dist/node/docs/index.js +104 -0
  98. package/dist/node/docs/integration-hub.docblock.js +104 -0
  99. package/dist/node/events.js +211 -0
  100. package/dist/node/example.js +42 -0
  101. package/dist/node/handlers/index.js +246 -0
  102. package/dist/node/handlers/integration.handlers.js +246 -0
  103. package/dist/node/index.js +1595 -0
  104. package/dist/node/integration/index.js +92 -0
  105. package/dist/node/integration/integration.enum.js +12 -0
  106. package/dist/node/integration/integration.operations.js +89 -0
  107. package/dist/node/integration/integration.presentation.js +117 -0
  108. package/dist/node/integration/integration.schema.js +42 -0
  109. package/dist/node/integration-hub.capability.js +40 -0
  110. package/dist/node/integration-hub.feature.js +114 -0
  111. package/dist/node/seeders/index.js +60 -0
  112. package/dist/node/sync/index.js +332 -0
  113. package/dist/node/sync/sync.enum.js +26 -0
  114. package/dist/node/sync/sync.operations.js +321 -0
  115. package/dist/node/sync/sync.presentation.js +298 -0
  116. package/dist/node/sync/sync.schema.js +154 -0
  117. package/dist/node/sync-engine/index.js +186 -0
  118. package/dist/node/tests/operations.test-spec.js +85 -0
  119. package/dist/node/ui/IntegrationDashboard.js +369 -0
  120. package/dist/node/ui/hooks/index.js +57 -0
  121. package/dist/node/ui/hooks/useIntegrationData.js +54 -0
  122. package/dist/node/ui/index.js +644 -0
  123. package/dist/node/ui/renderers/index.js +273 -0
  124. package/dist/node/ui/renderers/integration.markdown.js +273 -0
  125. package/dist/seeders/index.d.ts +4 -8
  126. package/dist/seeders/index.d.ts.map +1 -1
  127. package/dist/seeders/index.js +58 -16
  128. package/dist/sync/index.d.ts +7 -4
  129. package/dist/sync/index.d.ts.map +1 -0
  130. package/dist/sync/index.js +332 -4
  131. package/dist/sync/sync.enum.d.ts +3 -8
  132. package/dist/sync/sync.enum.d.ts.map +1 -1
  133. package/dist/sync/sync.enum.js +23 -31
  134. package/dist/sync/sync.operations.d.ts +413 -419
  135. package/dist/sync/sync.operations.d.ts.map +1 -1
  136. package/dist/sync/sync.operations.js +316 -197
  137. package/dist/sync/sync.presentation.d.ts +6 -11
  138. package/dist/sync/sync.presentation.d.ts.map +1 -1
  139. package/dist/sync/sync.presentation.js +291 -160
  140. package/dist/sync/sync.schema.d.ts +317 -322
  141. package/dist/sync/sync.schema.d.ts.map +1 -1
  142. package/dist/sync/sync.schema.js +146 -295
  143. package/dist/sync-engine/index.d.ts +88 -91
  144. package/dist/sync-engine/index.d.ts.map +1 -1
  145. package/dist/sync-engine/index.js +181 -142
  146. package/dist/tests/operations.test-spec.d.ts +3 -8
  147. package/dist/tests/operations.test-spec.d.ts.map +1 -1
  148. package/dist/tests/operations.test-spec.js +82 -90
  149. package/dist/ui/IntegrationDashboard.d.ts +1 -6
  150. package/dist/ui/IntegrationDashboard.d.ts.map +1 -1
  151. package/dist/ui/IntegrationDashboard.js +365 -261
  152. package/dist/ui/hooks/index.d.ts +2 -2
  153. package/dist/ui/hooks/index.d.ts.map +1 -0
  154. package/dist/ui/hooks/index.js +57 -4
  155. package/dist/ui/hooks/useIntegrationData.d.ts +16 -20
  156. package/dist/ui/hooks/useIntegrationData.d.ts.map +1 -1
  157. package/dist/ui/hooks/useIntegrationData.js +51 -55
  158. package/dist/ui/index.d.ts +7 -6
  159. package/dist/ui/index.d.ts.map +1 -0
  160. package/dist/ui/index.js +644 -5
  161. package/dist/ui/renderers/index.d.ts +2 -2
  162. package/dist/ui/renderers/index.d.ts.map +1 -0
  163. package/dist/ui/renderers/index.js +274 -3
  164. package/dist/ui/renderers/integration.markdown.d.ts +13 -15
  165. package/dist/ui/renderers/integration.markdown.d.ts.map +1 -1
  166. package/dist/ui/renderers/integration.markdown.js +268 -250
  167. package/package.json +361 -72
  168. package/dist/connection/connection.enum.js.map +0 -1
  169. package/dist/connection/connection.operation.js.map +0 -1
  170. package/dist/connection/connection.presentation.js.map +0 -1
  171. package/dist/connection/connection.schema.js.map +0 -1
  172. package/dist/docs/integration-hub.docblock.js.map +0 -1
  173. package/dist/events.js.map +0 -1
  174. package/dist/example.js.map +0 -1
  175. package/dist/handlers/integration.handlers.js.map +0 -1
  176. package/dist/integration/integration.enum.js.map +0 -1
  177. package/dist/integration/integration.operations.js.map +0 -1
  178. package/dist/integration/integration.presentation.js.map +0 -1
  179. package/dist/integration/integration.schema.js.map +0 -1
  180. package/dist/integration-hub.capability.js.map +0 -1
  181. package/dist/integration-hub.feature.js.map +0 -1
  182. package/dist/seeders/index.js.map +0 -1
  183. package/dist/sync/sync.enum.js.map +0 -1
  184. package/dist/sync/sync.operations.js.map +0 -1
  185. package/dist/sync/sync.presentation.js.map +0 -1
  186. package/dist/sync/sync.schema.js.map +0 -1
  187. package/dist/sync-engine/index.js.map +0 -1
  188. package/dist/tests/operations.test-spec.js.map +0 -1
  189. package/dist/ui/IntegrationDashboard.js.map +0 -1
  190. package/dist/ui/hooks/useIntegrationData.js.map +0 -1
  191. package/dist/ui/renderers/integration.markdown.js.map +0 -1
package/README.md CHANGED
@@ -2,12 +2,13 @@
2
2
 
3
3
  Website: https://contractspec.io/
4
4
 
5
-
6
5
  A comprehensive integration hub example demonstrating ContractSpec principles for data synchronization.
7
6
 
8
7
  ## Features
9
8
 
10
9
  - **Multi-Provider Support**: Connect to various external systems (Salesforce, HubSpot, etc.)
10
+ - **Voice Provider Coverage**: Includes seeded examples for `ai-voice.gradium` and `ai-voice.fal`
11
+ - **Analytics Coverage**: Includes seeded examples for PostHog analytics
11
12
  - **Bidirectional Sync**: INBOUND, OUTBOUND, or BIDIRECTIONAL data flow
12
13
  - **Field Mapping**: Configurable field mappings with transforms
13
14
  - **Sync Engine**: Change detection, deduplication, and error handling
@@ -18,12 +19,14 @@ A comprehensive integration hub example demonstrating ContractSpec principles fo
18
19
  ## Entities
19
20
 
20
21
  ### Core
22
+
21
23
  - `Integration` - Integration definition
22
24
  - `Connection` - Authenticated connection to external system
23
25
  - `SyncConfig` - Sync configuration for object pairs
24
26
  - `FieldMapping` - Field-level mapping configuration
25
27
 
26
28
  ### Sync Execution
29
+
27
30
  - `SyncRun` - A single sync execution
28
31
  - `SyncLog` - Log entries for a sync run
29
32
  - `SyncRecord` - Tracks synced records for deduplication
@@ -31,14 +34,17 @@ A comprehensive integration hub example demonstrating ContractSpec principles fo
31
34
  ## Contracts
32
35
 
33
36
  ### Integration Management
37
+
34
38
  - `integration.create` - Create a new integration
35
39
  - `integration.connection.create` - Create a connection
36
40
 
37
41
  ### Sync Configuration
42
+
38
43
  - `integration.syncConfig.create` - Create sync config
39
44
  - `integration.fieldMapping.add` - Add field mapping
40
45
 
41
46
  ### Sync Execution
47
+
42
48
  - `integration.sync.trigger` - Trigger manual sync
43
49
  - `integration.syncRun.list` - List sync history
44
50
 
@@ -101,11 +107,11 @@ const result = engine.transformRecord(
101
107
  ## Usage
102
108
 
103
109
  ```typescript
104
- import {
110
+ import {
105
111
  CreateIntegrationContract,
106
112
  CreateSyncConfigContract,
107
113
  TriggerSyncContract,
108
- integrationHubSchemaContribution
114
+ integrationHubSchemaContribution
109
115
  } from '@contractspec/example.integration-hub';
110
116
 
111
117
  // Create integration
@@ -138,19 +144,3 @@ const run = await executeContract(TriggerSyncContract, {
138
144
  - `@contractspec/lib.files` - Import/export file handling
139
145
  - `@contractspec/lib.jobs` - Background sync jobs
140
146
  - `@contractspec/module.audit-trail` - Action auditing
141
-
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
-
156
-
@@ -0,0 +1,12 @@
1
+ // src/connection/connection.enum.ts
2
+ import { defineEnum } from "@contractspec/lib.schema";
3
+ var ConnectionStatusEnum = defineEnum("ConnectionStatus", [
4
+ "PENDING",
5
+ "CONNECTED",
6
+ "DISCONNECTED",
7
+ "ERROR",
8
+ "EXPIRED"
9
+ ]);
10
+ export {
11
+ ConnectionStatusEnum
12
+ };
@@ -0,0 +1,101 @@
1
+ // src/connection/connection.enum.ts
2
+ import { defineEnum } from "@contractspec/lib.schema";
3
+ var ConnectionStatusEnum = defineEnum("ConnectionStatus", [
4
+ "PENDING",
5
+ "CONNECTED",
6
+ "DISCONNECTED",
7
+ "ERROR",
8
+ "EXPIRED"
9
+ ]);
10
+
11
+ // src/connection/connection.schema.ts
12
+ import { defineSchemaModel, ScalarTypeEnum } from "@contractspec/lib.schema";
13
+ var ConnectionModel = defineSchemaModel({
14
+ name: "ConnectionModel",
15
+ fields: {
16
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
17
+ integrationId: {
18
+ type: ScalarTypeEnum.String_unsecure(),
19
+ isOptional: false
20
+ },
21
+ name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
22
+ status: { type: ConnectionStatusEnum, isOptional: false },
23
+ authType: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
24
+ externalAccountName: {
25
+ type: ScalarTypeEnum.String_unsecure(),
26
+ isOptional: true
27
+ },
28
+ connectedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
29
+ lastHealthCheck: { type: ScalarTypeEnum.DateTime(), isOptional: true },
30
+ healthStatus: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
31
+ }
32
+ });
33
+ var CreateConnectionInputModel = defineSchemaModel({
34
+ name: "CreateConnectionInput",
35
+ fields: {
36
+ integrationId: {
37
+ type: ScalarTypeEnum.String_unsecure(),
38
+ isOptional: false
39
+ },
40
+ name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
41
+ authType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
42
+ credentials: { type: ScalarTypeEnum.JSON(), isOptional: true }
43
+ }
44
+ });
45
+
46
+ // src/connection/connection.operation.ts
47
+ import { defineCommand } from "@contractspec/lib.contracts/operations";
48
+ var OWNERS = ["@example.integration-hub"];
49
+ var CreateConnectionContract = defineCommand({
50
+ meta: {
51
+ key: "integration.connection.create",
52
+ version: "1.0.0",
53
+ stability: "stable",
54
+ owners: [...OWNERS],
55
+ tags: ["integration", "connection", "create"],
56
+ description: "Create a connection to an external system.",
57
+ goal: "Authenticate with external systems.",
58
+ context: "Connection setup."
59
+ },
60
+ io: { input: CreateConnectionInputModel, output: ConnectionModel },
61
+ policy: { auth: "user" },
62
+ sideEffects: {
63
+ emits: [
64
+ {
65
+ key: "integration.connection.created",
66
+ version: "1.0.0",
67
+ when: "Connection created",
68
+ payload: ConnectionModel
69
+ }
70
+ ],
71
+ audit: ["integration.connection.created"]
72
+ },
73
+ acceptance: {
74
+ scenarios: [
75
+ {
76
+ key: "create-connection-happy-path",
77
+ given: ["User is authenticated"],
78
+ when: ["User creates connection with valid credentials"],
79
+ then: ["Connection is created", "ConnectionCreated event is emitted"]
80
+ }
81
+ ],
82
+ examples: [
83
+ {
84
+ key: "connect-crm",
85
+ input: {
86
+ name: "Salesforce Prod",
87
+ integrationId: "salesforce",
88
+ credentials: { clientId: "xxx" }
89
+ },
90
+ output: {
91
+ id: "conn-123",
92
+ status: "connected",
93
+ connectedAt: "2025-01-01T12:00:00Z"
94
+ }
95
+ }
96
+ ]
97
+ }
98
+ });
99
+ export {
100
+ CreateConnectionContract
101
+ };
@@ -0,0 +1,99 @@
1
+ // src/connection/connection.enum.ts
2
+ import { defineEnum } from "@contractspec/lib.schema";
3
+ var ConnectionStatusEnum = defineEnum("ConnectionStatus", [
4
+ "PENDING",
5
+ "CONNECTED",
6
+ "DISCONNECTED",
7
+ "ERROR",
8
+ "EXPIRED"
9
+ ]);
10
+
11
+ // src/connection/connection.schema.ts
12
+ import { defineSchemaModel, ScalarTypeEnum } from "@contractspec/lib.schema";
13
+ var ConnectionModel = defineSchemaModel({
14
+ name: "ConnectionModel",
15
+ fields: {
16
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
17
+ integrationId: {
18
+ type: ScalarTypeEnum.String_unsecure(),
19
+ isOptional: false
20
+ },
21
+ name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
22
+ status: { type: ConnectionStatusEnum, isOptional: false },
23
+ authType: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
24
+ externalAccountName: {
25
+ type: ScalarTypeEnum.String_unsecure(),
26
+ isOptional: true
27
+ },
28
+ connectedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
29
+ lastHealthCheck: { type: ScalarTypeEnum.DateTime(), isOptional: true },
30
+ healthStatus: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
31
+ }
32
+ });
33
+ var CreateConnectionInputModel = defineSchemaModel({
34
+ name: "CreateConnectionInput",
35
+ fields: {
36
+ integrationId: {
37
+ type: ScalarTypeEnum.String_unsecure(),
38
+ isOptional: false
39
+ },
40
+ name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
41
+ authType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
42
+ credentials: { type: ScalarTypeEnum.JSON(), isOptional: true }
43
+ }
44
+ });
45
+
46
+ // src/connection/connection.presentation.ts
47
+ import { definePresentation, StabilityEnum } from "@contractspec/lib.contracts";
48
+ var ConnectionListPresentation = definePresentation({
49
+ meta: {
50
+ key: "integration.connection.list",
51
+ version: "1.0.0",
52
+ title: "Connection List",
53
+ description: "List of integration connections",
54
+ domain: "integration",
55
+ owners: ["@integration-team"],
56
+ tags: ["integration", "connection", "list"],
57
+ stability: StabilityEnum.Experimental,
58
+ goal: "Provide an overview of all established integration connections.",
59
+ context: "The primary management view for integration hubs."
60
+ },
61
+ source: {
62
+ type: "component",
63
+ framework: "react",
64
+ componentKey: "ConnectionList",
65
+ props: ConnectionModel
66
+ },
67
+ targets: ["react", "markdown"],
68
+ policy: {
69
+ flags: ["integration.enabled"]
70
+ }
71
+ });
72
+ var ConnectionSetupPresentation = definePresentation({
73
+ meta: {
74
+ key: "integration.connection.setup",
75
+ version: "1.0.0",
76
+ title: "Connection Setup",
77
+ description: "Setup wizard for creating integration connections",
78
+ domain: "integration",
79
+ owners: ["@integration-team"],
80
+ tags: ["integration", "connection", "setup"],
81
+ stability: StabilityEnum.Experimental,
82
+ goal: "Guide users through the multi-step process of connecting to a new integration.",
83
+ context: "The onboarding flow for new integrations."
84
+ },
85
+ source: {
86
+ type: "component",
87
+ framework: "react",
88
+ componentKey: "ConnectionSetup",
89
+ props: ConnectionModel
90
+ },
91
+ targets: ["react"],
92
+ policy: {
93
+ flags: ["integration.enabled"]
94
+ }
95
+ });
96
+ export {
97
+ ConnectionSetupPresentation,
98
+ ConnectionListPresentation
99
+ };
@@ -0,0 +1,48 @@
1
+ // src/connection/connection.enum.ts
2
+ import { defineEnum } from "@contractspec/lib.schema";
3
+ var ConnectionStatusEnum = defineEnum("ConnectionStatus", [
4
+ "PENDING",
5
+ "CONNECTED",
6
+ "DISCONNECTED",
7
+ "ERROR",
8
+ "EXPIRED"
9
+ ]);
10
+
11
+ // src/connection/connection.schema.ts
12
+ import { defineSchemaModel, ScalarTypeEnum } from "@contractspec/lib.schema";
13
+ var ConnectionModel = defineSchemaModel({
14
+ name: "ConnectionModel",
15
+ fields: {
16
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
17
+ integrationId: {
18
+ type: ScalarTypeEnum.String_unsecure(),
19
+ isOptional: false
20
+ },
21
+ name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
22
+ status: { type: ConnectionStatusEnum, isOptional: false },
23
+ authType: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
24
+ externalAccountName: {
25
+ type: ScalarTypeEnum.String_unsecure(),
26
+ isOptional: true
27
+ },
28
+ connectedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
29
+ lastHealthCheck: { type: ScalarTypeEnum.DateTime(), isOptional: true },
30
+ healthStatus: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
31
+ }
32
+ });
33
+ var CreateConnectionInputModel = defineSchemaModel({
34
+ name: "CreateConnectionInput",
35
+ fields: {
36
+ integrationId: {
37
+ type: ScalarTypeEnum.String_unsecure(),
38
+ isOptional: false
39
+ },
40
+ name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
41
+ authType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
42
+ credentials: { type: ScalarTypeEnum.JSON(), isOptional: true }
43
+ }
44
+ });
45
+ export {
46
+ CreateConnectionInputModel,
47
+ ConnectionModel
48
+ };
@@ -0,0 +1,104 @@
1
+ // src/connection/connection.enum.ts
2
+ import { defineEnum } from "@contractspec/lib.schema";
3
+ var ConnectionStatusEnum = defineEnum("ConnectionStatus", [
4
+ "PENDING",
5
+ "CONNECTED",
6
+ "DISCONNECTED",
7
+ "ERROR",
8
+ "EXPIRED"
9
+ ]);
10
+
11
+ // src/connection/connection.schema.ts
12
+ import { defineSchemaModel, ScalarTypeEnum } from "@contractspec/lib.schema";
13
+ var ConnectionModel = defineSchemaModel({
14
+ name: "ConnectionModel",
15
+ fields: {
16
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
17
+ integrationId: {
18
+ type: ScalarTypeEnum.String_unsecure(),
19
+ isOptional: false
20
+ },
21
+ name: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
22
+ status: { type: ConnectionStatusEnum, isOptional: false },
23
+ authType: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
24
+ externalAccountName: {
25
+ type: ScalarTypeEnum.String_unsecure(),
26
+ isOptional: true
27
+ },
28
+ connectedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
29
+ lastHealthCheck: { type: ScalarTypeEnum.DateTime(), isOptional: true },
30
+ healthStatus: { type: ScalarTypeEnum.String_unsecure(), isOptional: true }
31
+ }
32
+ });
33
+ var CreateConnectionInputModel = defineSchemaModel({
34
+ name: "CreateConnectionInput",
35
+ fields: {
36
+ integrationId: {
37
+ type: ScalarTypeEnum.String_unsecure(),
38
+ isOptional: false
39
+ },
40
+ name: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
41
+ authType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
42
+ credentials: { type: ScalarTypeEnum.JSON(), isOptional: true }
43
+ }
44
+ });
45
+
46
+ // src/connection/connection.operation.ts
47
+ import { defineCommand } from "@contractspec/lib.contracts/operations";
48
+ var OWNERS = ["@example.integration-hub"];
49
+ var CreateConnectionContract = defineCommand({
50
+ meta: {
51
+ key: "integration.connection.create",
52
+ version: "1.0.0",
53
+ stability: "stable",
54
+ owners: [...OWNERS],
55
+ tags: ["integration", "connection", "create"],
56
+ description: "Create a connection to an external system.",
57
+ goal: "Authenticate with external systems.",
58
+ context: "Connection setup."
59
+ },
60
+ io: { input: CreateConnectionInputModel, output: ConnectionModel },
61
+ policy: { auth: "user" },
62
+ sideEffects: {
63
+ emits: [
64
+ {
65
+ key: "integration.connection.created",
66
+ version: "1.0.0",
67
+ when: "Connection created",
68
+ payload: ConnectionModel
69
+ }
70
+ ],
71
+ audit: ["integration.connection.created"]
72
+ },
73
+ acceptance: {
74
+ scenarios: [
75
+ {
76
+ key: "create-connection-happy-path",
77
+ given: ["User is authenticated"],
78
+ when: ["User creates connection with valid credentials"],
79
+ then: ["Connection is created", "ConnectionCreated event is emitted"]
80
+ }
81
+ ],
82
+ examples: [
83
+ {
84
+ key: "connect-crm",
85
+ input: {
86
+ name: "Salesforce Prod",
87
+ integrationId: "salesforce",
88
+ credentials: { clientId: "xxx" }
89
+ },
90
+ output: {
91
+ id: "conn-123",
92
+ status: "connected",
93
+ connectedAt: "2025-01-01T12:00:00Z"
94
+ }
95
+ }
96
+ ]
97
+ }
98
+ });
99
+ export {
100
+ CreateConnectionInputModel,
101
+ CreateConnectionContract,
102
+ ConnectionStatusEnum,
103
+ ConnectionModel
104
+ };
@@ -0,0 +1,104 @@
1
+ // src/docs/integration-hub.docblock.ts
2
+ import { registerDocBlocks } from "@contractspec/lib.contracts/docs";
3
+ var integrationHubDocBlocks = [
4
+ {
5
+ id: "docs.examples.integration-hub",
6
+ title: "Integration Hub",
7
+ summary: "Generic integration center with connectors, connections, sync configs, field mappings, and sync logs.",
8
+ kind: "reference",
9
+ visibility: "public",
10
+ route: "/docs/examples/integration-hub",
11
+ tags: ["integrations", "sync", "etl", "connectors"],
12
+ body: `## Entities
13
+
14
+ - Integration, Connection, SyncConfig, FieldMapping, SyncLog.
15
+ - Sync engine config lives in \`src/sync-engine\` to map remote <-> local entities.
16
+
17
+ ## Contracts
18
+
19
+ - \`integration.create\`, \`integration.connect\`, \`integration.configureSync\`, \`integration.mapFields\`, \`integration.runSync\`.
20
+ - Uses Jobs module for scheduled syncs and retries; Files module for payload archives.
21
+
22
+ ## Events
23
+
24
+ - sync.started/completed/failed, connection.connected/disconnected, mapping.updated.
25
+ - Forward to Notifications and Audit for observability.
26
+
27
+ ## UI / Presentations
28
+
29
+ - Dashboard, integration list, connection detail, sync config editor.
30
+ - Templates registered as \`integration-hub\` in Template Registry.
31
+
32
+ ## Notes
33
+
34
+ - Providers remain agnostic; keep mappings declarative for safe regeneration.
35
+ - Seed data includes voice integrations for \`ai-voice.gradium\` and \`ai-voice.fal\`.
36
+ - Feature flags can gate specific providers; metering can track sync volume.
37
+ `
38
+ },
39
+ {
40
+ id: "docs.examples.integration-hub.goal",
41
+ title: "Integration Hub — Goal",
42
+ summary: "Why this integration hub exists and what success looks like.",
43
+ kind: "goal",
44
+ visibility: "public",
45
+ route: "/docs/examples/integration-hub/goal",
46
+ tags: ["integrations", "goal"],
47
+ body: `## Why it matters
48
+ - Gives a regenerable, provider-agnostic integration hub with explicit mappings.
49
+ - Prevents drift between sync configs, mappings, and event/log outputs.
50
+
51
+ ## Business/Product goal
52
+ - Model connectors, connections, sync jobs, and mappings with governance and retries.
53
+ - Support staged provider rollouts via Feature Flags and observability via Audit/Notifications.
54
+
55
+ ## Success criteria
56
+ - Connections and mappings regenerate safely after spec edits.
57
+ - Sync events and logs provide auditability; payloads are stored and PII-scoped.`
58
+ },
59
+ {
60
+ id: "docs.examples.integration-hub.usage",
61
+ title: "Integration Hub — Usage",
62
+ summary: "How to configure connectors, mappings, and scheduled syncs.",
63
+ kind: "usage",
64
+ visibility: "public",
65
+ route: "/docs/examples/integration-hub/usage",
66
+ tags: ["integrations", "usage"],
67
+ body: `## Setup
68
+ 1) Seed integrations/connections (if available) or create connector definitions.
69
+ 2) Configure sync jobs with Jobs module; store payload archives via Files.
70
+
71
+ ## Extend & regenerate
72
+ 1) Add mapping fields or provider configs in the spec; include validation and PII paths.
73
+ 2) Regenerate to align UI/API/events/logs; verify Notifications/Audit hooks.
74
+ 3) Gate risky providers behind Feature Flags; meter sync volume if needed.
75
+
76
+ ## Guardrails
77
+ - Keep mappings declarative; avoid hardcoded transforms.
78
+ - Emit events for sync lifecycle; persist logs for audit.
79
+ - Redact sensitive payload paths in presentations.`
80
+ },
81
+ {
82
+ id: "docs.examples.integration-hub.constraints",
83
+ title: "Integration Hub — Constraints & Safety",
84
+ summary: "Internal guidance for sync lifecycle, mappings, and regeneration safety.",
85
+ kind: "reference",
86
+ visibility: "internal",
87
+ route: "/docs/examples/integration-hub/constraints",
88
+ tags: ["integrations", "constraints", "internal"],
89
+ body: `## Constraints
90
+ - Mappings and sync states must remain declarative in spec; no hidden code transforms.
91
+ - Events to emit at minimum: sync.started, sync.completed, sync.failed; connection.connected/disconnected.
92
+ - Regeneration should not alter retry/backoff semantics without explicit spec change.
93
+
94
+ ## PII & Payloads
95
+ - Treat payload archives as potentially sensitive; mark policy.pii paths.
96
+ - For MCP/web, avoid exposing raw credentials/tokens; store via provider adapters only.
97
+
98
+ ## Verification
99
+ - Include fixtures for mapping changes and sync retries.
100
+ - Validate that scheduled jobs (cron) are spec-driven; Jobs module wiring intact.
101
+ - Ensure Audit/Notifications receive sync lifecycle events.`
102
+ }
103
+ ];
104
+ registerDocBlocks(integrationHubDocBlocks);
@@ -0,0 +1,104 @@
1
+ // src/docs/integration-hub.docblock.ts
2
+ import { registerDocBlocks } from "@contractspec/lib.contracts/docs";
3
+ var integrationHubDocBlocks = [
4
+ {
5
+ id: "docs.examples.integration-hub",
6
+ title: "Integration Hub",
7
+ summary: "Generic integration center with connectors, connections, sync configs, field mappings, and sync logs.",
8
+ kind: "reference",
9
+ visibility: "public",
10
+ route: "/docs/examples/integration-hub",
11
+ tags: ["integrations", "sync", "etl", "connectors"],
12
+ body: `## Entities
13
+
14
+ - Integration, Connection, SyncConfig, FieldMapping, SyncLog.
15
+ - Sync engine config lives in \`src/sync-engine\` to map remote <-> local entities.
16
+
17
+ ## Contracts
18
+
19
+ - \`integration.create\`, \`integration.connect\`, \`integration.configureSync\`, \`integration.mapFields\`, \`integration.runSync\`.
20
+ - Uses Jobs module for scheduled syncs and retries; Files module for payload archives.
21
+
22
+ ## Events
23
+
24
+ - sync.started/completed/failed, connection.connected/disconnected, mapping.updated.
25
+ - Forward to Notifications and Audit for observability.
26
+
27
+ ## UI / Presentations
28
+
29
+ - Dashboard, integration list, connection detail, sync config editor.
30
+ - Templates registered as \`integration-hub\` in Template Registry.
31
+
32
+ ## Notes
33
+
34
+ - Providers remain agnostic; keep mappings declarative for safe regeneration.
35
+ - Seed data includes voice integrations for \`ai-voice.gradium\` and \`ai-voice.fal\`.
36
+ - Feature flags can gate specific providers; metering can track sync volume.
37
+ `
38
+ },
39
+ {
40
+ id: "docs.examples.integration-hub.goal",
41
+ title: "Integration Hub — Goal",
42
+ summary: "Why this integration hub exists and what success looks like.",
43
+ kind: "goal",
44
+ visibility: "public",
45
+ route: "/docs/examples/integration-hub/goal",
46
+ tags: ["integrations", "goal"],
47
+ body: `## Why it matters
48
+ - Gives a regenerable, provider-agnostic integration hub with explicit mappings.
49
+ - Prevents drift between sync configs, mappings, and event/log outputs.
50
+
51
+ ## Business/Product goal
52
+ - Model connectors, connections, sync jobs, and mappings with governance and retries.
53
+ - Support staged provider rollouts via Feature Flags and observability via Audit/Notifications.
54
+
55
+ ## Success criteria
56
+ - Connections and mappings regenerate safely after spec edits.
57
+ - Sync events and logs provide auditability; payloads are stored and PII-scoped.`
58
+ },
59
+ {
60
+ id: "docs.examples.integration-hub.usage",
61
+ title: "Integration Hub — Usage",
62
+ summary: "How to configure connectors, mappings, and scheduled syncs.",
63
+ kind: "usage",
64
+ visibility: "public",
65
+ route: "/docs/examples/integration-hub/usage",
66
+ tags: ["integrations", "usage"],
67
+ body: `## Setup
68
+ 1) Seed integrations/connections (if available) or create connector definitions.
69
+ 2) Configure sync jobs with Jobs module; store payload archives via Files.
70
+
71
+ ## Extend & regenerate
72
+ 1) Add mapping fields or provider configs in the spec; include validation and PII paths.
73
+ 2) Regenerate to align UI/API/events/logs; verify Notifications/Audit hooks.
74
+ 3) Gate risky providers behind Feature Flags; meter sync volume if needed.
75
+
76
+ ## Guardrails
77
+ - Keep mappings declarative; avoid hardcoded transforms.
78
+ - Emit events for sync lifecycle; persist logs for audit.
79
+ - Redact sensitive payload paths in presentations.`
80
+ },
81
+ {
82
+ id: "docs.examples.integration-hub.constraints",
83
+ title: "Integration Hub — Constraints & Safety",
84
+ summary: "Internal guidance for sync lifecycle, mappings, and regeneration safety.",
85
+ kind: "reference",
86
+ visibility: "internal",
87
+ route: "/docs/examples/integration-hub/constraints",
88
+ tags: ["integrations", "constraints", "internal"],
89
+ body: `## Constraints
90
+ - Mappings and sync states must remain declarative in spec; no hidden code transforms.
91
+ - Events to emit at minimum: sync.started, sync.completed, sync.failed; connection.connected/disconnected.
92
+ - Regeneration should not alter retry/backoff semantics without explicit spec change.
93
+
94
+ ## PII & Payloads
95
+ - Treat payload archives as potentially sensitive; mark policy.pii paths.
96
+ - For MCP/web, avoid exposing raw credentials/tokens; store via provider adapters only.
97
+
98
+ ## Verification
99
+ - Include fixtures for mapping changes and sync retries.
100
+ - Validate that scheduled jobs (cron) are spec-driven; Jobs module wiring intact.
101
+ - Ensure Audit/Notifications receive sync lifecycle events.`
102
+ }
103
+ ];
104
+ registerDocBlocks(integrationHubDocBlocks);