@contractspec/lib.contracts-integrations 2.0.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 (240) hide show
  1. package/README.md +3 -0
  2. package/dist/index.d.ts +11 -0
  3. package/dist/index.js +3676 -0
  4. package/dist/integrations/binding.d.ts +14 -0
  5. package/dist/integrations/binding.js +1 -0
  6. package/dist/integrations/connection.d.ts +47 -0
  7. package/dist/integrations/connection.js +1 -0
  8. package/dist/integrations/docs/integrations.docblock.d.ts +2 -0
  9. package/dist/integrations/docs/integrations.docblock.js +110 -0
  10. package/dist/integrations/health.d.ts +17 -0
  11. package/dist/integrations/health.js +73 -0
  12. package/dist/integrations/health.test.d.ts +1 -0
  13. package/dist/integrations/index.d.ts +11 -0
  14. package/dist/integrations/index.js +3264 -0
  15. package/dist/integrations/integrations.capability.d.ts +1 -0
  16. package/dist/integrations/integrations.capability.js +18 -0
  17. package/dist/integrations/integrations.feature.d.ts +5 -0
  18. package/dist/integrations/integrations.feature.js +33 -0
  19. package/dist/integrations/meeting-recorder/contracts/index.d.ts +7 -0
  20. package/dist/integrations/meeting-recorder/contracts/index.js +474 -0
  21. package/dist/integrations/meeting-recorder/contracts/meetings.d.ts +451 -0
  22. package/dist/integrations/meeting-recorder/contracts/meetings.js +219 -0
  23. package/dist/integrations/meeting-recorder/contracts/transcripts.d.ts +166 -0
  24. package/dist/integrations/meeting-recorder/contracts/transcripts.js +287 -0
  25. package/dist/integrations/meeting-recorder/contracts/webhooks.d.ts +85 -0
  26. package/dist/integrations/meeting-recorder/contracts/webhooks.js +172 -0
  27. package/dist/integrations/meeting-recorder/meeting-recorder.capability.d.ts +1 -0
  28. package/dist/integrations/meeting-recorder/meeting-recorder.capability.js +18 -0
  29. package/dist/integrations/meeting-recorder/meeting-recorder.feature.d.ts +5 -0
  30. package/dist/integrations/meeting-recorder/meeting-recorder.feature.js +33 -0
  31. package/dist/integrations/meeting-recorder/models.d.ts +402 -0
  32. package/dist/integrations/meeting-recorder/models.js +122 -0
  33. package/dist/integrations/meeting-recorder/telemetry.d.ts +13 -0
  34. package/dist/integrations/meeting-recorder/telemetry.js +54 -0
  35. package/dist/integrations/openbanking/contracts/accounts.d.ts +282 -0
  36. package/dist/integrations/openbanking/contracts/accounts.js +328 -0
  37. package/dist/integrations/openbanking/contracts/balances.d.ts +158 -0
  38. package/dist/integrations/openbanking/contracts/balances.js +292 -0
  39. package/dist/integrations/openbanking/contracts/index.d.ts +7 -0
  40. package/dist/integrations/openbanking/contracts/index.js +644 -0
  41. package/dist/integrations/openbanking/contracts/transactions.d.ts +206 -0
  42. package/dist/integrations/openbanking/contracts/transactions.js +298 -0
  43. package/dist/integrations/openbanking/guards.d.ts +8 -0
  44. package/dist/integrations/openbanking/guards.js +42 -0
  45. package/dist/integrations/openbanking/guards.test.d.ts +1 -0
  46. package/dist/integrations/openbanking/models.d.ts +223 -0
  47. package/dist/integrations/openbanking/models.js +110 -0
  48. package/dist/integrations/openbanking/openbanking.capability.d.ts +1 -0
  49. package/dist/integrations/openbanking/openbanking.capability.js +18 -0
  50. package/dist/integrations/openbanking/openbanking.feature.d.ts +5 -0
  51. package/dist/integrations/openbanking/openbanking.feature.js +35 -0
  52. package/dist/integrations/openbanking/telemetry.d.ts +12 -0
  53. package/dist/integrations/openbanking/telemetry.js +51 -0
  54. package/dist/integrations/operations.d.ts +430 -0
  55. package/dist/integrations/operations.js +297 -0
  56. package/dist/integrations/operations.test.d.ts +1 -0
  57. package/dist/integrations/providers/analytics-reader.d.ts +103 -0
  58. package/dist/integrations/providers/analytics-reader.js +1 -0
  59. package/dist/integrations/providers/analytics-writer.d.ts +6 -0
  60. package/dist/integrations/providers/analytics-writer.js +1 -0
  61. package/dist/integrations/providers/analytics.d.ts +47 -0
  62. package/dist/integrations/providers/analytics.js +1 -0
  63. package/dist/integrations/providers/calendar.d.ts +75 -0
  64. package/dist/integrations/providers/calendar.js +1 -0
  65. package/dist/integrations/providers/database.d.ts +12 -0
  66. package/dist/integrations/providers/database.js +1 -0
  67. package/dist/integrations/providers/elevenlabs.d.ts +3 -0
  68. package/dist/integrations/providers/elevenlabs.js +86 -0
  69. package/dist/integrations/providers/email.d.ts +83 -0
  70. package/dist/integrations/providers/email.js +1 -0
  71. package/dist/integrations/providers/embedding.d.ts +21 -0
  72. package/dist/integrations/providers/embedding.js +1 -0
  73. package/dist/integrations/providers/fal.d.ts +3 -0
  74. package/dist/integrations/providers/fal.js +112 -0
  75. package/dist/integrations/providers/fathom.d.ts +3 -0
  76. package/dist/integrations/providers/fathom.js +126 -0
  77. package/dist/integrations/providers/fireflies.d.ts +3 -0
  78. package/dist/integrations/providers/fireflies.js +106 -0
  79. package/dist/integrations/providers/gcs-storage.d.ts +3 -0
  80. package/dist/integrations/providers/gcs-storage.js +97 -0
  81. package/dist/integrations/providers/gmail.d.ts +3 -0
  82. package/dist/integrations/providers/gmail.js +109 -0
  83. package/dist/integrations/providers/google-calendar.d.ts +3 -0
  84. package/dist/integrations/providers/google-calendar.js +92 -0
  85. package/dist/integrations/providers/gradium.d.ts +3 -0
  86. package/dist/integrations/providers/gradium.js +110 -0
  87. package/dist/integrations/providers/granola.d.ts +3 -0
  88. package/dist/integrations/providers/granola.js +107 -0
  89. package/dist/integrations/providers/index.d.ts +38 -0
  90. package/dist/integrations/providers/index.js +2094 -0
  91. package/dist/integrations/providers/jira.d.ts +3 -0
  92. package/dist/integrations/providers/jira.js +108 -0
  93. package/dist/integrations/providers/linear.d.ts +3 -0
  94. package/dist/integrations/providers/linear.js +107 -0
  95. package/dist/integrations/providers/llm.d.ts +79 -0
  96. package/dist/integrations/providers/llm.js +1 -0
  97. package/dist/integrations/providers/meeting-recorder.d.ts +129 -0
  98. package/dist/integrations/providers/meeting-recorder.js +1 -0
  99. package/dist/integrations/providers/mistral.d.ts +3 -0
  100. package/dist/integrations/providers/mistral.js +94 -0
  101. package/dist/integrations/providers/notion.d.ts +3 -0
  102. package/dist/integrations/providers/notion.js +113 -0
  103. package/dist/integrations/providers/openbanking.d.ts +125 -0
  104. package/dist/integrations/providers/openbanking.js +1 -0
  105. package/dist/integrations/providers/payments.d.ts +106 -0
  106. package/dist/integrations/providers/payments.js +1 -0
  107. package/dist/integrations/providers/posthog-llm-telemetry.d.ts +51 -0
  108. package/dist/integrations/providers/posthog-llm-telemetry.js +176 -0
  109. package/dist/integrations/providers/posthog.d.ts +3 -0
  110. package/dist/integrations/providers/posthog.js +106 -0
  111. package/dist/integrations/providers/postmark.d.ts +3 -0
  112. package/dist/integrations/providers/postmark.js +98 -0
  113. package/dist/integrations/providers/powens.d.ts +3 -0
  114. package/dist/integrations/providers/powens.js +124 -0
  115. package/dist/integrations/providers/project-management.d.ts +32 -0
  116. package/dist/integrations/providers/project-management.js +1 -0
  117. package/dist/integrations/providers/providers.test.d.ts +1 -0
  118. package/dist/integrations/providers/qdrant.d.ts +3 -0
  119. package/dist/integrations/providers/qdrant.js +101 -0
  120. package/dist/integrations/providers/registry.d.ts +6 -0
  121. package/dist/integrations/providers/registry.js +1878 -0
  122. package/dist/integrations/providers/sms.d.ts +31 -0
  123. package/dist/integrations/providers/sms.js +1 -0
  124. package/dist/integrations/providers/storage.d.ts +57 -0
  125. package/dist/integrations/providers/storage.js +1 -0
  126. package/dist/integrations/providers/stripe.d.ts +3 -0
  127. package/dist/integrations/providers/stripe.js +105 -0
  128. package/dist/integrations/providers/supabase-postgres.d.ts +3 -0
  129. package/dist/integrations/providers/supabase-postgres.js +87 -0
  130. package/dist/integrations/providers/supabase-vector.d.ts +3 -0
  131. package/dist/integrations/providers/supabase-vector.js +107 -0
  132. package/dist/integrations/providers/tldv.d.ts +3 -0
  133. package/dist/integrations/providers/tldv.js +106 -0
  134. package/dist/integrations/providers/twilio-sms.d.ts +3 -0
  135. package/dist/integrations/providers/twilio-sms.js +91 -0
  136. package/dist/integrations/providers/vector-store.d.ts +39 -0
  137. package/dist/integrations/providers/vector-store.js +1 -0
  138. package/dist/integrations/providers/voice.d.ts +31 -0
  139. package/dist/integrations/providers/voice.js +1 -0
  140. package/dist/integrations/runtime.d.ts +95 -0
  141. package/dist/integrations/runtime.js +209 -0
  142. package/dist/integrations/runtime.test.d.ts +1 -0
  143. package/dist/integrations/secrets/aws-secret-manager.d.ts +28 -0
  144. package/dist/integrations/secrets/aws-secret-manager.js +346 -0
  145. package/dist/integrations/secrets/env-secret-provider.d.ts +28 -0
  146. package/dist/integrations/secrets/env-secret-provider.js +159 -0
  147. package/dist/integrations/secrets/gcp-secret-manager.d.ts +29 -0
  148. package/dist/integrations/secrets/gcp-secret-manager.js +347 -0
  149. package/dist/integrations/secrets/index.d.ts +6 -0
  150. package/dist/integrations/secrets/index.js +1129 -0
  151. package/dist/integrations/secrets/manager.d.ts +44 -0
  152. package/dist/integrations/secrets/manager.js +183 -0
  153. package/dist/integrations/secrets/provider.d.ts +49 -0
  154. package/dist/integrations/secrets/provider.js +74 -0
  155. package/dist/integrations/secrets/provider.test.d.ts +1 -0
  156. package/dist/integrations/secrets/scaleway-secret-manager.d.ts +35 -0
  157. package/dist/integrations/secrets/scaleway-secret-manager.js +375 -0
  158. package/dist/integrations/secrets-types.d.ts +14 -0
  159. package/dist/integrations/secrets-types.js +1 -0
  160. package/dist/integrations/spec.d.ts +72 -0
  161. package/dist/integrations/spec.js +22 -0
  162. package/dist/integrations/spec.test.d.ts +1 -0
  163. package/dist/node/index.js +3675 -0
  164. package/dist/node/integrations/binding.js +0 -0
  165. package/dist/node/integrations/connection.js +0 -0
  166. package/dist/node/integrations/docs/integrations.docblock.js +109 -0
  167. package/dist/node/integrations/health.js +72 -0
  168. package/dist/node/integrations/index.js +3263 -0
  169. package/dist/node/integrations/integrations.capability.js +17 -0
  170. package/dist/node/integrations/integrations.feature.js +32 -0
  171. package/dist/node/integrations/meeting-recorder/contracts/index.js +473 -0
  172. package/dist/node/integrations/meeting-recorder/contracts/meetings.js +218 -0
  173. package/dist/node/integrations/meeting-recorder/contracts/transcripts.js +286 -0
  174. package/dist/node/integrations/meeting-recorder/contracts/webhooks.js +171 -0
  175. package/dist/node/integrations/meeting-recorder/meeting-recorder.capability.js +17 -0
  176. package/dist/node/integrations/meeting-recorder/meeting-recorder.feature.js +32 -0
  177. package/dist/node/integrations/meeting-recorder/models.js +121 -0
  178. package/dist/node/integrations/meeting-recorder/telemetry.js +53 -0
  179. package/dist/node/integrations/openbanking/contracts/accounts.js +327 -0
  180. package/dist/node/integrations/openbanking/contracts/balances.js +291 -0
  181. package/dist/node/integrations/openbanking/contracts/index.js +643 -0
  182. package/dist/node/integrations/openbanking/contracts/transactions.js +297 -0
  183. package/dist/node/integrations/openbanking/guards.js +41 -0
  184. package/dist/node/integrations/openbanking/models.js +109 -0
  185. package/dist/node/integrations/openbanking/openbanking.capability.js +17 -0
  186. package/dist/node/integrations/openbanking/openbanking.feature.js +34 -0
  187. package/dist/node/integrations/openbanking/telemetry.js +50 -0
  188. package/dist/node/integrations/operations.js +296 -0
  189. package/dist/node/integrations/providers/analytics-reader.js +0 -0
  190. package/dist/node/integrations/providers/analytics-writer.js +0 -0
  191. package/dist/node/integrations/providers/analytics.js +0 -0
  192. package/dist/node/integrations/providers/calendar.js +0 -0
  193. package/dist/node/integrations/providers/database.js +0 -0
  194. package/dist/node/integrations/providers/elevenlabs.js +85 -0
  195. package/dist/node/integrations/providers/email.js +0 -0
  196. package/dist/node/integrations/providers/embedding.js +0 -0
  197. package/dist/node/integrations/providers/fal.js +111 -0
  198. package/dist/node/integrations/providers/fathom.js +125 -0
  199. package/dist/node/integrations/providers/fireflies.js +105 -0
  200. package/dist/node/integrations/providers/gcs-storage.js +96 -0
  201. package/dist/node/integrations/providers/gmail.js +108 -0
  202. package/dist/node/integrations/providers/google-calendar.js +91 -0
  203. package/dist/node/integrations/providers/gradium.js +109 -0
  204. package/dist/node/integrations/providers/granola.js +106 -0
  205. package/dist/node/integrations/providers/index.js +2093 -0
  206. package/dist/node/integrations/providers/jira.js +107 -0
  207. package/dist/node/integrations/providers/linear.js +106 -0
  208. package/dist/node/integrations/providers/llm.js +0 -0
  209. package/dist/node/integrations/providers/meeting-recorder.js +0 -0
  210. package/dist/node/integrations/providers/mistral.js +93 -0
  211. package/dist/node/integrations/providers/notion.js +112 -0
  212. package/dist/node/integrations/providers/openbanking.js +0 -0
  213. package/dist/node/integrations/providers/payments.js +0 -0
  214. package/dist/node/integrations/providers/posthog-llm-telemetry.js +175 -0
  215. package/dist/node/integrations/providers/posthog.js +105 -0
  216. package/dist/node/integrations/providers/postmark.js +97 -0
  217. package/dist/node/integrations/providers/powens.js +123 -0
  218. package/dist/node/integrations/providers/project-management.js +0 -0
  219. package/dist/node/integrations/providers/qdrant.js +100 -0
  220. package/dist/node/integrations/providers/registry.js +1877 -0
  221. package/dist/node/integrations/providers/sms.js +0 -0
  222. package/dist/node/integrations/providers/storage.js +0 -0
  223. package/dist/node/integrations/providers/stripe.js +104 -0
  224. package/dist/node/integrations/providers/supabase-postgres.js +86 -0
  225. package/dist/node/integrations/providers/supabase-vector.js +106 -0
  226. package/dist/node/integrations/providers/tldv.js +105 -0
  227. package/dist/node/integrations/providers/twilio-sms.js +90 -0
  228. package/dist/node/integrations/providers/vector-store.js +0 -0
  229. package/dist/node/integrations/providers/voice.js +0 -0
  230. package/dist/node/integrations/runtime.js +208 -0
  231. package/dist/node/integrations/secrets/aws-secret-manager.js +345 -0
  232. package/dist/node/integrations/secrets/env-secret-provider.js +158 -0
  233. package/dist/node/integrations/secrets/gcp-secret-manager.js +346 -0
  234. package/dist/node/integrations/secrets/index.js +1128 -0
  235. package/dist/node/integrations/secrets/manager.js +182 -0
  236. package/dist/node/integrations/secrets/provider.js +73 -0
  237. package/dist/node/integrations/secrets/scaleway-secret-manager.js +374 -0
  238. package/dist/node/integrations/secrets-types.js +0 -0
  239. package/dist/node/integrations/spec.js +21 -0
  240. package/package.json +1029 -0
@@ -0,0 +1 @@
1
+ export declare const IntegrationsCapability: import("@contractspec/lib.contracts-spec").CapabilitySpec;
@@ -0,0 +1,18 @@
1
+ // @bun
2
+ // src/integrations/integrations.capability.ts
3
+ import { defineCapability } from "@contractspec/lib.contracts-spec/capabilities";
4
+ import { StabilityEnum } from "@contractspec/lib.contracts-spec/ownership";
5
+ var IntegrationsCapability = defineCapability({
6
+ meta: {
7
+ key: "integrations",
8
+ version: "1.0.0",
9
+ kind: "integration",
10
+ stability: StabilityEnum.Experimental,
11
+ description: "Core integrations capability for third-party connections",
12
+ owners: ["@platform.core"],
13
+ tags: ["integrations", "platform"]
14
+ }
15
+ });
16
+ export {
17
+ IntegrationsCapability
18
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Platform Integrations feature module that bundles
3
+ * integration connection management capabilities.
4
+ */
5
+ export declare const IntegrationsFeature: import("@contractspec/lib.contracts-spec").FeatureModuleSpec;
@@ -0,0 +1,33 @@
1
+ // @bun
2
+ // src/integrations/integrations.feature.ts
3
+ import { defineFeature } from "@contractspec/lib.contracts-spec/features";
4
+ var IntegrationsFeature = defineFeature({
5
+ meta: {
6
+ key: "platform.integrations",
7
+ version: "1.0.0",
8
+ title: "Platform Integrations",
9
+ description: "Manage integration connections to external providers (e.g., Stripe, Qdrant)",
10
+ domain: "platform",
11
+ owners: ["@platform.integrations"],
12
+ tags: ["integrations", "connections", "platform"],
13
+ stability: "experimental"
14
+ },
15
+ operations: [
16
+ { key: "integrations.connection.create", version: "1.0.0" },
17
+ { key: "integrations.connection.update", version: "1.0.0" },
18
+ { key: "integrations.connection.delete", version: "1.0.0" },
19
+ { key: "integrations.connection.list", version: "1.0.0" },
20
+ { key: "integrations.connection.test", version: "1.0.0" }
21
+ ],
22
+ events: [],
23
+ presentations: [],
24
+ opToPresentation: [],
25
+ presentationsTargets: [],
26
+ capabilities: {
27
+ provides: [{ key: "integrations", version: "1.0.0" }],
28
+ requires: [{ key: "identity", version: "1.0.0" }]
29
+ }
30
+ });
31
+ export {
32
+ IntegrationsFeature
33
+ };
@@ -0,0 +1,7 @@
1
+ import type { OperationSpecRegistry } from '@contractspec/lib.contracts-spec/operations/registry';
2
+ import { MeetingRecorderGetMeeting, MeetingRecorderListMeetings } from './meetings';
3
+ import { MeetingRecorderGetTranscript, MeetingRecorderSyncTranscript } from './transcripts';
4
+ import { MeetingRecorderWebhookIngest } from './webhooks';
5
+ export { MeetingRecorderGetMeeting, MeetingRecorderListMeetings, MeetingRecorderGetTranscript, MeetingRecorderSyncTranscript, MeetingRecorderWebhookIngest, };
6
+ export * from '../meeting-recorder.feature';
7
+ export declare function registerMeetingRecorderContracts(registry: OperationSpecRegistry): OperationSpecRegistry;
@@ -0,0 +1,474 @@
1
+ // @bun
2
+ // src/integrations/meeting-recorder/models.ts
3
+ import { ScalarTypeEnum, SchemaModel } from "@contractspec/lib.schema";
4
+ var MeetingParticipantRecord = new SchemaModel({
5
+ name: "MeetingParticipantRecord",
6
+ description: "Canonical participant entry for meetings and transcripts from recorder providers.",
7
+ fields: {
8
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
9
+ externalId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
10
+ name: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
11
+ email: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
12
+ role: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
13
+ isExternal: { type: ScalarTypeEnum.Boolean(), isOptional: true },
14
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
15
+ }
16
+ });
17
+ var MeetingTranscriptSegmentRecord = new SchemaModel({
18
+ name: "MeetingTranscriptSegmentRecord",
19
+ description: "A single transcript segment with speaker attribution.",
20
+ fields: {
21
+ index: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },
22
+ speakerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
23
+ speakerName: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
24
+ speakerEmail: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
25
+ text: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
26
+ startTimeMs: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
27
+ endTimeMs: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
28
+ startTime: { type: ScalarTypeEnum.DateTime(), isOptional: true },
29
+ endTime: { type: ScalarTypeEnum.DateTime(), isOptional: true },
30
+ confidence: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
31
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
32
+ }
33
+ });
34
+ var MeetingRecord = new SchemaModel({
35
+ name: "MeetingRecord",
36
+ description: "Canonical meeting metadata synced from meeting recorder providers.",
37
+ fields: {
38
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
39
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
40
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
41
+ externalId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
42
+ title: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
43
+ summary: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
44
+ organizer: { type: MeetingParticipantRecord, isOptional: true },
45
+ invitees: {
46
+ type: MeetingParticipantRecord,
47
+ isArray: true,
48
+ isOptional: true
49
+ },
50
+ participants: {
51
+ type: MeetingParticipantRecord,
52
+ isArray: true,
53
+ isOptional: true
54
+ },
55
+ scheduledStartAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
56
+ scheduledEndAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
57
+ recordingStartAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
58
+ recordingEndAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
59
+ durationSeconds: {
60
+ type: ScalarTypeEnum.Float_unsecure(),
61
+ isOptional: true
62
+ },
63
+ meetingUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
64
+ recordingUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
65
+ shareUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
66
+ sourcePlatform: {
67
+ type: ScalarTypeEnum.String_unsecure(),
68
+ isOptional: true
69
+ },
70
+ language: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
71
+ transcriptAvailable: { type: ScalarTypeEnum.Boolean(), isOptional: true },
72
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
73
+ updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
74
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
75
+ }
76
+ });
77
+ var MeetingTranscriptRecord = new SchemaModel({
78
+ name: "MeetingTranscriptRecord",
79
+ description: "Canonical transcript payload for a recorded meeting.",
80
+ fields: {
81
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
82
+ meetingId: { type: ScalarTypeEnum.ID(), isOptional: false },
83
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
84
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
85
+ externalId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
86
+ format: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
87
+ text: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
88
+ segments: {
89
+ type: MeetingTranscriptSegmentRecord,
90
+ isArray: true,
91
+ isOptional: true
92
+ },
93
+ language: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
94
+ sourceUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
95
+ generatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
96
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true },
97
+ raw: { type: ScalarTypeEnum.JSON(), isOptional: true }
98
+ }
99
+ });
100
+ var MeetingRecorderWebhookEventRecord = new SchemaModel({
101
+ name: "MeetingRecorderWebhookEventRecord",
102
+ description: "Normalized webhook event from a meeting recorder provider.",
103
+ fields: {
104
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
105
+ providerKey: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
106
+ eventType: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
107
+ meetingId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
108
+ transcriptId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
109
+ recordingId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
110
+ receivedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
111
+ verified: { type: ScalarTypeEnum.Boolean(), isOptional: true },
112
+ payload: { type: ScalarTypeEnum.JSON(), isOptional: true },
113
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
114
+ }
115
+ });
116
+
117
+ // src/integrations/meeting-recorder/contracts/meetings.ts
118
+ import { ScalarTypeEnum as ScalarTypeEnum2, SchemaModel as SchemaModel2 } from "@contractspec/lib.schema";
119
+ import {
120
+ defineQuery
121
+ } from "@contractspec/lib.contracts-spec/operations";
122
+ var MeetingRecorderListMeetingsInput = new SchemaModel2({
123
+ name: "MeetingRecorderListMeetingsInput",
124
+ description: "Parameters for listing meetings from a meeting recorder provider.",
125
+ fields: {
126
+ tenantId: { type: ScalarTypeEnum2.ID(), isOptional: false },
127
+ connectionId: { type: ScalarTypeEnum2.ID(), isOptional: true },
128
+ from: { type: ScalarTypeEnum2.DateTime(), isOptional: true },
129
+ to: { type: ScalarTypeEnum2.DateTime(), isOptional: true },
130
+ cursor: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
131
+ pageSize: { type: ScalarTypeEnum2.Int_unsecure(), isOptional: true },
132
+ query: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
133
+ organizerEmail: {
134
+ type: ScalarTypeEnum2.String_unsecure(),
135
+ isOptional: true
136
+ },
137
+ participantEmail: {
138
+ type: ScalarTypeEnum2.String_unsecure(),
139
+ isOptional: true
140
+ },
141
+ includeTranscript: { type: ScalarTypeEnum2.Boolean(), isOptional: true },
142
+ includeSummary: { type: ScalarTypeEnum2.Boolean(), isOptional: true }
143
+ }
144
+ });
145
+ var MeetingRecorderListMeetingsOutput = new SchemaModel2({
146
+ name: "MeetingRecorderListMeetingsOutput",
147
+ description: "Paginated list of meetings for a recorder provider.",
148
+ fields: {
149
+ meetings: {
150
+ type: MeetingRecord,
151
+ isOptional: false,
152
+ isArray: true
153
+ },
154
+ nextCursor: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
155
+ hasMore: { type: ScalarTypeEnum2.Boolean(), isOptional: true }
156
+ }
157
+ });
158
+ var MeetingRecorderGetMeetingInput = new SchemaModel2({
159
+ name: "MeetingRecorderGetMeetingInput",
160
+ description: "Parameters for retrieving a single meeting record.",
161
+ fields: {
162
+ tenantId: { type: ScalarTypeEnum2.ID(), isOptional: false },
163
+ meetingId: { type: ScalarTypeEnum2.ID(), isOptional: false },
164
+ connectionId: { type: ScalarTypeEnum2.ID(), isOptional: true },
165
+ includeTranscript: { type: ScalarTypeEnum2.Boolean(), isOptional: true },
166
+ includeSummary: { type: ScalarTypeEnum2.Boolean(), isOptional: true }
167
+ }
168
+ });
169
+ var MeetingRecorderListMeetings = defineQuery({
170
+ meta: {
171
+ key: "meeting-recorder.meetings.list",
172
+ version: "1.0.0",
173
+ description: "List meetings recorded by the configured meeting provider.",
174
+ goal: "Provide downstream workflows with recent meetings and metadata.",
175
+ context: "Used by integration hubs and sync workflows to enumerate meetings before pulling transcripts.",
176
+ owners: ["@platform.integrations"],
177
+ tags: ["meeting-recorder", "meetings", "transcripts"],
178
+ stability: "experimental"
179
+ },
180
+ io: {
181
+ input: MeetingRecorderListMeetingsInput,
182
+ output: MeetingRecorderListMeetingsOutput
183
+ },
184
+ policy: {
185
+ auth: "user"
186
+ }
187
+ });
188
+ var MeetingRecorderGetMeeting = defineQuery({
189
+ meta: {
190
+ key: "meeting-recorder.meetings.get",
191
+ version: "1.0.0",
192
+ description: "Retrieve metadata for a single meeting recording.",
193
+ goal: "Allow downstream experiences to display detailed meeting metadata.",
194
+ context: "Used when drilling into a specific meeting from a transcript or integration dashboard.",
195
+ owners: ["@platform.integrations"],
196
+ tags: ["meeting-recorder", "meetings"],
197
+ stability: "experimental"
198
+ },
199
+ io: {
200
+ input: MeetingRecorderGetMeetingInput,
201
+ output: MeetingRecord
202
+ },
203
+ policy: {
204
+ auth: "user"
205
+ }
206
+ });
207
+ var meetingRecorderMeetingContracts = {
208
+ MeetingRecorderListMeetings,
209
+ MeetingRecorderGetMeeting
210
+ };
211
+ function registerMeetingRecorderMeetingContracts(registry) {
212
+ return registry.register(MeetingRecorderListMeetings).register(MeetingRecorderGetMeeting);
213
+ }
214
+
215
+ // src/integrations/meeting-recorder/telemetry.ts
216
+ var MEETING_RECORDER_PII_FIELDS = [
217
+ "email",
218
+ "organizerEmail",
219
+ "participantEmail",
220
+ "participants",
221
+ "invitees",
222
+ "attendees",
223
+ "speakerName",
224
+ "speakerEmail",
225
+ "name",
226
+ "phone",
227
+ "phoneNumber",
228
+ "displayName"
229
+ ];
230
+ var MEETING_RECORDER_TELEMETRY_EVENTS = {
231
+ meetingsSynced: "meeting-recorder.meetings.synced",
232
+ meetingsSyncFailed: "meeting-recorder.meetings.sync_failed",
233
+ transcriptsFetched: "meeting-recorder.transcripts.fetched",
234
+ transcriptsFetchFailed: "meeting-recorder.transcripts.fetch_failed",
235
+ transcriptsSynced: "meeting-recorder.transcripts.synced",
236
+ transcriptsSyncFailed: "meeting-recorder.transcripts.sync_failed",
237
+ webhookReceived: "meeting-recorder.webhooks.received",
238
+ webhookRejected: "meeting-recorder.webhooks.rejected"
239
+ };
240
+ function redactMeetingRecorderTelemetryPayload(payload) {
241
+ const redacted = {};
242
+ for (const [key, value] of Object.entries(payload)) {
243
+ if (MEETING_RECORDER_PII_FIELDS.includes(key)) {
244
+ redacted[key] = maskValue(value);
245
+ } else if (Array.isArray(value)) {
246
+ redacted[key] = value.map((item) => typeof item === "object" && item !== null ? redactMeetingRecorderTelemetryPayload(item) : item);
247
+ } else if (typeof value === "object" && value !== null) {
248
+ redacted[key] = redactMeetingRecorderTelemetryPayload(value);
249
+ } else {
250
+ redacted[key] = value;
251
+ }
252
+ }
253
+ return redacted;
254
+ }
255
+ function maskValue(value) {
256
+ if (value == null)
257
+ return "";
258
+ const str = String(value);
259
+ if (str.length <= 4)
260
+ return "*".repeat(str.length);
261
+ return `${"*".repeat(Math.max(str.length - 4, 0))}${str.slice(-4)}`;
262
+ }
263
+
264
+ // src/integrations/meeting-recorder/contracts/transcripts.ts
265
+ import { ScalarTypeEnum as ScalarTypeEnum3, SchemaModel as SchemaModel3 } from "@contractspec/lib.schema";
266
+ import {
267
+ defineCommand,
268
+ defineQuery as defineQuery2
269
+ } from "@contractspec/lib.contracts-spec/operations";
270
+ var MeetingRecorderGetTranscriptInput = new SchemaModel3({
271
+ name: "MeetingRecorderGetTranscriptInput",
272
+ description: "Parameters for fetching a meeting transcript.",
273
+ fields: {
274
+ tenantId: { type: ScalarTypeEnum3.ID(), isOptional: false },
275
+ meetingId: { type: ScalarTypeEnum3.ID(), isOptional: false },
276
+ connectionId: { type: ScalarTypeEnum3.ID(), isOptional: true },
277
+ includeSegments: { type: ScalarTypeEnum3.Boolean(), isOptional: true },
278
+ format: { type: ScalarTypeEnum3.String_unsecure(), isOptional: true }
279
+ }
280
+ });
281
+ var MeetingRecorderSyncTranscriptInput = new SchemaModel3({
282
+ name: "MeetingRecorderSyncTranscriptInput",
283
+ description: "Command payload to synchronise meeting transcripts.",
284
+ fields: {
285
+ tenantId: { type: ScalarTypeEnum3.ID(), isOptional: false },
286
+ meetingId: { type: ScalarTypeEnum3.ID(), isOptional: false },
287
+ connectionId: { type: ScalarTypeEnum3.ID(), isOptional: true },
288
+ forceRefresh: { type: ScalarTypeEnum3.Boolean(), isOptional: true },
289
+ triggerWebhooks: { type: ScalarTypeEnum3.Boolean(), isOptional: true }
290
+ }
291
+ });
292
+ var MeetingRecorderSyncTranscriptOutput = new SchemaModel3({
293
+ name: "MeetingRecorderSyncTranscriptOutput",
294
+ description: "Result of a transcript synchronisation run.",
295
+ fields: {
296
+ synced: { type: ScalarTypeEnum3.Int_unsecure(), isOptional: false },
297
+ failed: { type: ScalarTypeEnum3.Int_unsecure(), isOptional: false },
298
+ errors: {
299
+ type: ScalarTypeEnum3.String_unsecure(),
300
+ isArray: true,
301
+ isOptional: true
302
+ },
303
+ nextSyncSuggestedAt: {
304
+ type: ScalarTypeEnum3.DateTime(),
305
+ isOptional: true
306
+ }
307
+ }
308
+ });
309
+ var MeetingRecorderGetTranscript = defineQuery2({
310
+ meta: {
311
+ key: "meeting-recorder.transcripts.get",
312
+ version: "1.0.0",
313
+ description: "Fetch the transcript for a specific meeting recording.",
314
+ goal: "Expose meeting transcripts for downstream knowledge and analytics flows.",
315
+ context: "Used by agents and dashboards to access the transcript for a selected meeting.",
316
+ owners: ["@platform.integrations"],
317
+ tags: ["meeting-recorder", "transcripts"],
318
+ stability: "experimental"
319
+ },
320
+ io: {
321
+ input: MeetingRecorderGetTranscriptInput,
322
+ output: MeetingTranscriptRecord
323
+ },
324
+ policy: {
325
+ auth: "user"
326
+ }
327
+ });
328
+ var MeetingRecorderSyncTranscript = defineCommand({
329
+ meta: {
330
+ key: "meeting-recorder.transcripts.sync",
331
+ version: "1.0.0",
332
+ description: "Trigger a transcript sync from the meeting recorder provider.",
333
+ goal: "Keep canonical transcripts aligned with external meeting providers.",
334
+ context: "Invoked by scheduled jobs or webhooks when new transcripts are ready.",
335
+ owners: ["@platform.integrations"],
336
+ tags: ["meeting-recorder", "transcripts", "sync"],
337
+ stability: "experimental"
338
+ },
339
+ io: {
340
+ input: MeetingRecorderSyncTranscriptInput,
341
+ output: MeetingRecorderSyncTranscriptOutput
342
+ },
343
+ policy: {
344
+ auth: "admin"
345
+ },
346
+ telemetry: {
347
+ success: {
348
+ event: { key: MEETING_RECORDER_TELEMETRY_EVENTS.transcriptsSynced },
349
+ properties: ({ input, output }) => {
350
+ const payload = input;
351
+ const result = output;
352
+ return {
353
+ tenantId: payload?.tenantId,
354
+ meetingId: payload?.meetingId,
355
+ synced: result?.synced,
356
+ failed: result?.failed
357
+ };
358
+ }
359
+ },
360
+ failure: {
361
+ event: { key: MEETING_RECORDER_TELEMETRY_EVENTS.transcriptsSyncFailed },
362
+ properties: ({ input, error }) => {
363
+ const payload = input;
364
+ return {
365
+ tenantId: payload?.tenantId,
366
+ meetingId: payload?.meetingId,
367
+ error: error instanceof Error ? error.message : String(error ?? "unknown")
368
+ };
369
+ }
370
+ }
371
+ }
372
+ });
373
+ var meetingRecorderTranscriptContracts = {
374
+ MeetingRecorderGetTranscript,
375
+ MeetingRecorderSyncTranscript
376
+ };
377
+ function registerMeetingRecorderTranscriptContracts(registry) {
378
+ return registry.register(MeetingRecorderGetTranscript).register(MeetingRecorderSyncTranscript);
379
+ }
380
+
381
+ // src/integrations/meeting-recorder/contracts/webhooks.ts
382
+ import { ScalarTypeEnum as ScalarTypeEnum4, SchemaModel as SchemaModel4 } from "@contractspec/lib.schema";
383
+ import {
384
+ defineCommand as defineCommand2
385
+ } from "@contractspec/lib.contracts-spec/operations";
386
+ var MeetingRecorderWebhookIngestInput = new SchemaModel4({
387
+ name: "MeetingRecorderWebhookIngestInput",
388
+ description: "Payload for ingesting a meeting recorder webhook event.",
389
+ fields: {
390
+ tenantId: { type: ScalarTypeEnum4.ID(), isOptional: false },
391
+ providerKey: { type: ScalarTypeEnum4.String_unsecure(), isOptional: false },
392
+ connectionId: { type: ScalarTypeEnum4.ID(), isOptional: true },
393
+ webhookId: { type: ScalarTypeEnum4.String_unsecure(), isOptional: true },
394
+ headers: { type: ScalarTypeEnum4.JSON(), isOptional: true },
395
+ payload: { type: ScalarTypeEnum4.JSON(), isOptional: false },
396
+ receivedAt: { type: ScalarTypeEnum4.DateTime(), isOptional: true }
397
+ }
398
+ });
399
+ var MeetingRecorderWebhookIngestOutput = new SchemaModel4({
400
+ name: "MeetingRecorderWebhookIngestOutput",
401
+ description: "Result of processing a meeting recorder webhook.",
402
+ fields: {
403
+ accepted: { type: ScalarTypeEnum4.Boolean(), isOptional: false },
404
+ event: { type: MeetingRecorderWebhookEventRecord, isOptional: true }
405
+ }
406
+ });
407
+ var MeetingRecorderWebhookIngest = defineCommand2({
408
+ meta: {
409
+ key: "meeting-recorder.webhooks.ingest",
410
+ version: "1.0.0",
411
+ description: "Ingest a webhook from a meeting recorder provider.",
412
+ goal: "Trigger transcript syncs or downstream workflows without polling.",
413
+ context: "Used by webhook handlers to validate and normalize provider webhook events.",
414
+ owners: ["@platform.integrations"],
415
+ tags: ["meeting-recorder", "webhooks", "transcripts"],
416
+ stability: "experimental"
417
+ },
418
+ io: {
419
+ input: MeetingRecorderWebhookIngestInput,
420
+ output: MeetingRecorderWebhookIngestOutput
421
+ },
422
+ policy: {
423
+ auth: "admin"
424
+ }
425
+ });
426
+ var meetingRecorderWebhookContracts = {
427
+ MeetingRecorderWebhookIngest
428
+ };
429
+ function registerMeetingRecorderWebhookContracts(registry) {
430
+ return registry.register(MeetingRecorderWebhookIngest);
431
+ }
432
+
433
+ // src/integrations/meeting-recorder/meeting-recorder.feature.ts
434
+ import { defineFeature } from "@contractspec/lib.contracts-spec/features";
435
+ var MeetingRecorderFeature = defineFeature({
436
+ meta: {
437
+ key: "meeting-recorder",
438
+ version: "1.0.0",
439
+ title: "Meeting Recorder Integration",
440
+ description: "Meeting metadata, transcript retrieval, and webhook ingestion for meeting recorder providers.",
441
+ domain: "integrations",
442
+ owners: ["@platform.integrations"],
443
+ tags: ["meeting-recorder", "transcripts", "integrations"],
444
+ stability: "experimental"
445
+ },
446
+ operations: [
447
+ { key: "meeting-recorder.meetings.list", version: "1.0.0" },
448
+ { key: "meeting-recorder.meetings.get", version: "1.0.0" },
449
+ { key: "meeting-recorder.transcripts.get", version: "1.0.0" },
450
+ { key: "meeting-recorder.transcripts.sync", version: "1.0.0" },
451
+ { key: "meeting-recorder.webhooks.ingest", version: "1.0.0" }
452
+ ],
453
+ events: [],
454
+ presentations: [],
455
+ opToPresentation: [],
456
+ presentationsTargets: [],
457
+ capabilities: {
458
+ provides: [{ key: "meeting-recorder", version: "1.0.0" }],
459
+ requires: [{ key: "identity", version: "1.0.0" }]
460
+ }
461
+ });
462
+ // src/integrations/meeting-recorder/contracts/index.ts
463
+ function registerMeetingRecorderContracts(registry) {
464
+ return registerMeetingRecorderWebhookContracts(registerMeetingRecorderTranscriptContracts(registerMeetingRecorderMeetingContracts(registry)));
465
+ }
466
+ export {
467
+ registerMeetingRecorderContracts,
468
+ MeetingRecorderWebhookIngest,
469
+ MeetingRecorderSyncTranscript,
470
+ MeetingRecorderListMeetings,
471
+ MeetingRecorderGetTranscript,
472
+ MeetingRecorderGetMeeting,
473
+ MeetingRecorderFeature
474
+ };