@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,17 @@
1
+ // src/integrations/meeting-recorder/meeting-recorder.capability.ts
2
+ import { defineCapability } from "@contractspec/lib.contracts-spec/capabilities";
3
+ import { StabilityEnum } from "@contractspec/lib.contracts-spec/ownership";
4
+ var MeetingRecorderCapability = defineCapability({
5
+ meta: {
6
+ key: "meeting-recorder",
7
+ version: "1.0.0",
8
+ kind: "integration",
9
+ stability: StabilityEnum.Experimental,
10
+ description: "Meeting recorder integrations capability",
11
+ owners: ["@platform.integrations"],
12
+ tags: ["meeting-recorder", "transcripts", "integrations"]
13
+ }
14
+ });
15
+ export {
16
+ MeetingRecorderCapability
17
+ };
@@ -0,0 +1,32 @@
1
+ // src/integrations/meeting-recorder/meeting-recorder.feature.ts
2
+ import { defineFeature } from "@contractspec/lib.contracts-spec/features";
3
+ var MeetingRecorderFeature = defineFeature({
4
+ meta: {
5
+ key: "meeting-recorder",
6
+ version: "1.0.0",
7
+ title: "Meeting Recorder Integration",
8
+ description: "Meeting metadata, transcript retrieval, and webhook ingestion for meeting recorder providers.",
9
+ domain: "integrations",
10
+ owners: ["@platform.integrations"],
11
+ tags: ["meeting-recorder", "transcripts", "integrations"],
12
+ stability: "experimental"
13
+ },
14
+ operations: [
15
+ { key: "meeting-recorder.meetings.list", version: "1.0.0" },
16
+ { key: "meeting-recorder.meetings.get", version: "1.0.0" },
17
+ { key: "meeting-recorder.transcripts.get", version: "1.0.0" },
18
+ { key: "meeting-recorder.transcripts.sync", version: "1.0.0" },
19
+ { key: "meeting-recorder.webhooks.ingest", version: "1.0.0" }
20
+ ],
21
+ events: [],
22
+ presentations: [],
23
+ opToPresentation: [],
24
+ presentationsTargets: [],
25
+ capabilities: {
26
+ provides: [{ key: "meeting-recorder", version: "1.0.0" }],
27
+ requires: [{ key: "identity", version: "1.0.0" }]
28
+ }
29
+ });
30
+ export {
31
+ MeetingRecorderFeature
32
+ };
@@ -0,0 +1,121 @@
1
+ // src/integrations/meeting-recorder/models.ts
2
+ import { ScalarTypeEnum, SchemaModel } from "@contractspec/lib.schema";
3
+ var MeetingParticipantRecord = new SchemaModel({
4
+ name: "MeetingParticipantRecord",
5
+ description: "Canonical participant entry for meetings and transcripts from recorder providers.",
6
+ fields: {
7
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
8
+ externalId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
9
+ name: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
10
+ email: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
11
+ role: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
12
+ isExternal: { type: ScalarTypeEnum.Boolean(), isOptional: true },
13
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
14
+ }
15
+ });
16
+ var MeetingTranscriptSegmentRecord = new SchemaModel({
17
+ name: "MeetingTranscriptSegmentRecord",
18
+ description: "A single transcript segment with speaker attribution.",
19
+ fields: {
20
+ index: { type: ScalarTypeEnum.Int_unsecure(), isOptional: true },
21
+ speakerId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
22
+ speakerName: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
23
+ speakerEmail: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
24
+ text: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
25
+ startTimeMs: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
26
+ endTimeMs: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
27
+ startTime: { type: ScalarTypeEnum.DateTime(), isOptional: true },
28
+ endTime: { type: ScalarTypeEnum.DateTime(), isOptional: true },
29
+ confidence: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
30
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
31
+ }
32
+ });
33
+ var MeetingRecord = new SchemaModel({
34
+ name: "MeetingRecord",
35
+ description: "Canonical meeting metadata synced from meeting recorder providers.",
36
+ fields: {
37
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
38
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
39
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
40
+ externalId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
41
+ title: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
42
+ summary: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
43
+ organizer: { type: MeetingParticipantRecord, isOptional: true },
44
+ invitees: {
45
+ type: MeetingParticipantRecord,
46
+ isArray: true,
47
+ isOptional: true
48
+ },
49
+ participants: {
50
+ type: MeetingParticipantRecord,
51
+ isArray: true,
52
+ isOptional: true
53
+ },
54
+ scheduledStartAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
55
+ scheduledEndAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
56
+ recordingStartAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
57
+ recordingEndAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
58
+ durationSeconds: {
59
+ type: ScalarTypeEnum.Float_unsecure(),
60
+ isOptional: true
61
+ },
62
+ meetingUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
63
+ recordingUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
64
+ shareUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
65
+ sourcePlatform: {
66
+ type: ScalarTypeEnum.String_unsecure(),
67
+ isOptional: true
68
+ },
69
+ language: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
70
+ transcriptAvailable: { type: ScalarTypeEnum.Boolean(), isOptional: true },
71
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
72
+ updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
73
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
74
+ }
75
+ });
76
+ var MeetingTranscriptRecord = new SchemaModel({
77
+ name: "MeetingTranscriptRecord",
78
+ description: "Canonical transcript payload for a recorded meeting.",
79
+ fields: {
80
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
81
+ meetingId: { type: ScalarTypeEnum.ID(), isOptional: false },
82
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
83
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
84
+ externalId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
85
+ format: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
86
+ text: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
87
+ segments: {
88
+ type: MeetingTranscriptSegmentRecord,
89
+ isArray: true,
90
+ isOptional: true
91
+ },
92
+ language: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
93
+ sourceUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
94
+ generatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
95
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true },
96
+ raw: { type: ScalarTypeEnum.JSON(), isOptional: true }
97
+ }
98
+ });
99
+ var MeetingRecorderWebhookEventRecord = new SchemaModel({
100
+ name: "MeetingRecorderWebhookEventRecord",
101
+ description: "Normalized webhook event from a meeting recorder provider.",
102
+ fields: {
103
+ id: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
104
+ providerKey: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
105
+ eventType: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
106
+ meetingId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
107
+ transcriptId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
108
+ recordingId: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
109
+ receivedAt: { type: ScalarTypeEnum.DateTime(), isOptional: true },
110
+ verified: { type: ScalarTypeEnum.Boolean(), isOptional: true },
111
+ payload: { type: ScalarTypeEnum.JSON(), isOptional: true },
112
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
113
+ }
114
+ });
115
+ export {
116
+ MeetingTranscriptSegmentRecord,
117
+ MeetingTranscriptRecord,
118
+ MeetingRecorderWebhookEventRecord,
119
+ MeetingRecord,
120
+ MeetingParticipantRecord
121
+ };
@@ -0,0 +1,53 @@
1
+ // src/integrations/meeting-recorder/telemetry.ts
2
+ var MEETING_RECORDER_PII_FIELDS = [
3
+ "email",
4
+ "organizerEmail",
5
+ "participantEmail",
6
+ "participants",
7
+ "invitees",
8
+ "attendees",
9
+ "speakerName",
10
+ "speakerEmail",
11
+ "name",
12
+ "phone",
13
+ "phoneNumber",
14
+ "displayName"
15
+ ];
16
+ var MEETING_RECORDER_TELEMETRY_EVENTS = {
17
+ meetingsSynced: "meeting-recorder.meetings.synced",
18
+ meetingsSyncFailed: "meeting-recorder.meetings.sync_failed",
19
+ transcriptsFetched: "meeting-recorder.transcripts.fetched",
20
+ transcriptsFetchFailed: "meeting-recorder.transcripts.fetch_failed",
21
+ transcriptsSynced: "meeting-recorder.transcripts.synced",
22
+ transcriptsSyncFailed: "meeting-recorder.transcripts.sync_failed",
23
+ webhookReceived: "meeting-recorder.webhooks.received",
24
+ webhookRejected: "meeting-recorder.webhooks.rejected"
25
+ };
26
+ function redactMeetingRecorderTelemetryPayload(payload) {
27
+ const redacted = {};
28
+ for (const [key, value] of Object.entries(payload)) {
29
+ if (MEETING_RECORDER_PII_FIELDS.includes(key)) {
30
+ redacted[key] = maskValue(value);
31
+ } else if (Array.isArray(value)) {
32
+ redacted[key] = value.map((item) => typeof item === "object" && item !== null ? redactMeetingRecorderTelemetryPayload(item) : item);
33
+ } else if (typeof value === "object" && value !== null) {
34
+ redacted[key] = redactMeetingRecorderTelemetryPayload(value);
35
+ } else {
36
+ redacted[key] = value;
37
+ }
38
+ }
39
+ return redacted;
40
+ }
41
+ function maskValue(value) {
42
+ if (value == null)
43
+ return "";
44
+ const str = String(value);
45
+ if (str.length <= 4)
46
+ return "*".repeat(str.length);
47
+ return `${"*".repeat(Math.max(str.length - 4, 0))}${str.slice(-4)}`;
48
+ }
49
+ export {
50
+ redactMeetingRecorderTelemetryPayload,
51
+ MEETING_RECORDER_TELEMETRY_EVENTS,
52
+ MEETING_RECORDER_PII_FIELDS
53
+ };
@@ -0,0 +1,327 @@
1
+ // src/integrations/openbanking/models.ts
2
+ import { ScalarTypeEnum, SchemaModel } from "@contractspec/lib.schema";
3
+ var BankAccountRecord = new SchemaModel({
4
+ name: "BankAccountRecord",
5
+ description: "Canonical representation of a bank account synced from an open banking provider.",
6
+ fields: {
7
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
8
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
9
+ userId: { type: ScalarTypeEnum.ID(), isOptional: false },
10
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
11
+ externalId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
12
+ institutionId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
13
+ institutionName: {
14
+ type: ScalarTypeEnum.NonEmptyString(),
15
+ isOptional: false
16
+ },
17
+ institutionLogoUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
18
+ iban: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
19
+ bic: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
20
+ accountType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
21
+ currency: { type: ScalarTypeEnum.Currency(), isOptional: false },
22
+ displayName: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
23
+ accountNumberMasked: {
24
+ type: ScalarTypeEnum.String_unsecure(),
25
+ isOptional: true
26
+ },
27
+ productCode: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
28
+ balance: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
29
+ availableBalance: {
30
+ type: ScalarTypeEnum.Float_unsecure(),
31
+ isOptional: true
32
+ },
33
+ lastSyncedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
34
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
35
+ updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
36
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
37
+ }
38
+ });
39
+ var BankTransactionRecord = new SchemaModel({
40
+ name: "BankTransactionRecord",
41
+ description: "Canonical transaction entry mapped from Powens into the open banking ledger.",
42
+ fields: {
43
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
44
+ accountId: { type: ScalarTypeEnum.ID(), isOptional: false },
45
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
46
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
47
+ externalId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
48
+ amount: { type: ScalarTypeEnum.Float_unsecure(), isOptional: false },
49
+ currency: { type: ScalarTypeEnum.Currency(), isOptional: false },
50
+ date: { type: ScalarTypeEnum.DateTime(), isOptional: false },
51
+ bookingDate: { type: ScalarTypeEnum.DateTime(), isOptional: true },
52
+ valueDate: { type: ScalarTypeEnum.DateTime(), isOptional: true },
53
+ description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
54
+ counterpartyName: {
55
+ type: ScalarTypeEnum.String_unsecure(),
56
+ isOptional: true
57
+ },
58
+ counterpartyAccount: {
59
+ type: ScalarTypeEnum.String_unsecure(),
60
+ isOptional: true
61
+ },
62
+ merchantCategoryCode: {
63
+ type: ScalarTypeEnum.String_unsecure(),
64
+ isOptional: true
65
+ },
66
+ rawCategory: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
67
+ standardizedCategory: {
68
+ type: ScalarTypeEnum.String_unsecure(),
69
+ isOptional: true
70
+ },
71
+ transactionType: {
72
+ type: ScalarTypeEnum.NonEmptyString(),
73
+ isOptional: false
74
+ },
75
+ status: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
76
+ runningBalance: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
77
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true },
78
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
79
+ updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false }
80
+ }
81
+ });
82
+ var AccountBalanceRecord = new SchemaModel({
83
+ name: "AccountBalanceRecord",
84
+ description: "Canonical balance snapshot computed from Powens balance payloads.",
85
+ fields: {
86
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
87
+ accountId: { type: ScalarTypeEnum.ID(), isOptional: false },
88
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
89
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
90
+ balanceType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
91
+ currentBalance: {
92
+ type: ScalarTypeEnum.Float_unsecure(),
93
+ isOptional: false
94
+ },
95
+ availableBalance: {
96
+ type: ScalarTypeEnum.Float_unsecure(),
97
+ isOptional: true
98
+ },
99
+ currency: { type: ScalarTypeEnum.Currency(), isOptional: false },
100
+ lastUpdatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
101
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
102
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
103
+ }
104
+ });
105
+
106
+ // src/integrations/openbanking/telemetry.ts
107
+ var OPENBANKING_PII_FIELDS = [
108
+ "iban",
109
+ "bic",
110
+ "accountNumberMasked",
111
+ "accountNumber",
112
+ "counterpartyName",
113
+ "counterpartyAccount",
114
+ "description",
115
+ "merchantName",
116
+ "merchantCategoryCode",
117
+ "reference"
118
+ ];
119
+ var OPENBANKING_TELEMETRY_EVENTS = {
120
+ accountsSynced: "openbanking.accounts.synced",
121
+ accountsSyncFailed: "openbanking.accounts.sync_failed",
122
+ transactionsSynced: "openbanking.transactions.synced",
123
+ transactionsSyncFailed: "openbanking.transactions.sync_failed",
124
+ balancesRefreshed: "openbanking.balances.refreshed",
125
+ balancesRefreshFailed: "openbanking.balances.refresh_failed",
126
+ overviewGenerated: "openbanking.overview.generated"
127
+ };
128
+ function redactOpenBankingTelemetryPayload(payload) {
129
+ const redacted = {};
130
+ for (const [key, value] of Object.entries(payload)) {
131
+ if (OPENBANKING_PII_FIELDS.includes(key)) {
132
+ redacted[key] = maskValue(value);
133
+ } else if (Array.isArray(value)) {
134
+ redacted[key] = value.map((item) => typeof item === "object" && item !== null ? redactOpenBankingTelemetryPayload(item) : item);
135
+ } else if (typeof value === "object" && value !== null) {
136
+ redacted[key] = redactOpenBankingTelemetryPayload(value);
137
+ } else {
138
+ redacted[key] = value;
139
+ }
140
+ }
141
+ return redacted;
142
+ }
143
+ function maskValue(value) {
144
+ if (value == null)
145
+ return "";
146
+ const str = String(value);
147
+ if (str.length <= 4)
148
+ return "*".repeat(str.length);
149
+ return `${"*".repeat(Math.max(str.length - 4, 0))}${str.slice(-4)}`;
150
+ }
151
+
152
+ // src/integrations/openbanking/contracts/accounts.ts
153
+ import { ScalarTypeEnum as ScalarTypeEnum2, SchemaModel as SchemaModel2 } from "@contractspec/lib.schema";
154
+ import {
155
+ defineCommand,
156
+ defineQuery
157
+ } from "@contractspec/lib.contracts-spec/operations";
158
+ var OpenBankingListAccountsInput = new SchemaModel2({
159
+ name: "OpenBankingListAccountsInput",
160
+ description: "Parameters for listing bank accounts through the open banking provider.",
161
+ fields: {
162
+ tenantId: { type: ScalarTypeEnum2.ID(), isOptional: false },
163
+ userId: { type: ScalarTypeEnum2.ID(), isOptional: false },
164
+ connectionId: { type: ScalarTypeEnum2.ID(), isOptional: true },
165
+ includeBalances: { type: ScalarTypeEnum2.Boolean(), isOptional: true },
166
+ institutionId: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
167
+ cursor: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
168
+ pageSize: { type: ScalarTypeEnum2.Int_unsecure(), isOptional: true }
169
+ }
170
+ });
171
+ var OpenBankingListAccountsOutput = new SchemaModel2({
172
+ name: "OpenBankingListAccountsOutput",
173
+ description: "Paginated list of bank accounts available to the tenant and user.",
174
+ fields: {
175
+ accounts: {
176
+ type: BankAccountRecord,
177
+ isOptional: false,
178
+ isArray: true
179
+ },
180
+ nextCursor: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
181
+ hasMore: { type: ScalarTypeEnum2.Boolean(), isOptional: true }
182
+ }
183
+ });
184
+ var OpenBankingGetAccountInput = new SchemaModel2({
185
+ name: "OpenBankingGetAccountInput",
186
+ description: "Parameters for retrieving a specific bank account.",
187
+ fields: {
188
+ tenantId: { type: ScalarTypeEnum2.ID(), isOptional: false },
189
+ accountId: { type: ScalarTypeEnum2.ID(), isOptional: false },
190
+ includeBalances: { type: ScalarTypeEnum2.Boolean(), isOptional: true },
191
+ includeLatestTransactions: {
192
+ type: ScalarTypeEnum2.Boolean(),
193
+ isOptional: true
194
+ }
195
+ }
196
+ });
197
+ var OpenBankingSyncAccountsInput = new SchemaModel2({
198
+ name: "OpenBankingSyncAccountsInput",
199
+ description: "Command payload to trigger an account synchronisation against the open banking provider.",
200
+ fields: {
201
+ tenantId: { type: ScalarTypeEnum2.ID(), isOptional: false },
202
+ userId: { type: ScalarTypeEnum2.ID(), isOptional: true },
203
+ connectionId: { type: ScalarTypeEnum2.ID(), isOptional: false },
204
+ accountIds: {
205
+ type: ScalarTypeEnum2.ID(),
206
+ isArray: true,
207
+ isOptional: true
208
+ },
209
+ forceFullRefresh: { type: ScalarTypeEnum2.Boolean(), isOptional: true },
210
+ triggerWorkflows: { type: ScalarTypeEnum2.Boolean(), isOptional: true }
211
+ }
212
+ });
213
+ var OpenBankingSyncAccountsOutput = new SchemaModel2({
214
+ name: "OpenBankingSyncAccountsOutput",
215
+ description: "Result of a bank account synchronisation run.",
216
+ fields: {
217
+ synced: { type: ScalarTypeEnum2.Int_unsecure(), isOptional: false },
218
+ failed: { type: ScalarTypeEnum2.Int_unsecure(), isOptional: false },
219
+ errors: {
220
+ type: ScalarTypeEnum2.String_unsecure(),
221
+ isArray: true,
222
+ isOptional: true
223
+ },
224
+ nextSyncSuggestedAt: {
225
+ type: ScalarTypeEnum2.DateTime(),
226
+ isOptional: true
227
+ }
228
+ }
229
+ });
230
+ var OpenBankingListAccounts = defineQuery({
231
+ meta: {
232
+ key: "openbanking.accounts.list",
233
+ version: "1.0.0",
234
+ description: "List bank accounts available to a tenant/user via Powens Open Banking.",
235
+ goal: "Provide downstream workflows with the set of accounts accessible via the configured open banking connection.",
236
+ context: "Used by Pocket Family Office dashboards and sync workflows to enumerate bank accounts prior to syncing balances or transactions.",
237
+ owners: ["@platform.finance"],
238
+ tags: ["open-banking", "powens", "accounts"],
239
+ stability: "experimental"
240
+ },
241
+ io: {
242
+ input: OpenBankingListAccountsInput,
243
+ output: OpenBankingListAccountsOutput
244
+ },
245
+ policy: {
246
+ auth: "user"
247
+ }
248
+ });
249
+ var OpenBankingGetAccount = defineQuery({
250
+ meta: {
251
+ key: "openbanking.accounts.get",
252
+ version: "1.0.0",
253
+ description: "Retrieve the canonical bank account record for the given account identifier.",
254
+ goal: "Allow user-facing experiences and automations to display up-to-date account metadata.",
255
+ context: "Invoked by UI surfaces and workflow automation steps that require detailed metadata for a specific bank account.",
256
+ owners: ["@platform.finance"],
257
+ tags: ["open-banking", "powens", "accounts"],
258
+ stability: "experimental"
259
+ },
260
+ io: {
261
+ input: OpenBankingGetAccountInput,
262
+ output: BankAccountRecord
263
+ },
264
+ policy: {
265
+ auth: "user"
266
+ }
267
+ });
268
+ var OpenBankingSyncAccounts = defineCommand({
269
+ meta: {
270
+ key: "openbanking.accounts.sync",
271
+ version: "1.0.0",
272
+ description: "Initiate a synchronisation run to refresh bank account metadata from Powens.",
273
+ goal: "Keep canonical bank account records aligned with the external open banking provider.",
274
+ context: "Triggered by scheduled workflows or manual operator actions to reconcile account metadata prior to transaction/balance syncs.",
275
+ owners: ["@platform.finance"],
276
+ tags: ["open-banking", "powens", "accounts"],
277
+ stability: "experimental"
278
+ },
279
+ io: {
280
+ input: OpenBankingSyncAccountsInput,
281
+ output: OpenBankingSyncAccountsOutput
282
+ },
283
+ policy: {
284
+ auth: "admin"
285
+ },
286
+ telemetry: {
287
+ success: {
288
+ event: { key: OPENBANKING_TELEMETRY_EVENTS.accountsSynced },
289
+ properties: ({ input, output }) => {
290
+ const payload = input;
291
+ const result = output;
292
+ return {
293
+ tenantId: payload?.tenantId,
294
+ connectionId: payload?.connectionId,
295
+ synced: result?.synced,
296
+ failed: result?.failed
297
+ };
298
+ }
299
+ },
300
+ failure: {
301
+ event: { key: OPENBANKING_TELEMETRY_EVENTS.accountsSyncFailed },
302
+ properties: ({ input, error }) => {
303
+ const payload = input;
304
+ return {
305
+ tenantId: payload?.tenantId,
306
+ connectionId: payload?.connectionId,
307
+ error: error instanceof Error ? error.message : String(error ?? "unknown")
308
+ };
309
+ }
310
+ }
311
+ }
312
+ });
313
+ var openBankingAccountContracts = {
314
+ OpenBankingListAccounts,
315
+ OpenBankingGetAccount,
316
+ OpenBankingSyncAccounts
317
+ };
318
+ function registerOpenBankingAccountContracts(registry) {
319
+ return registry.register(OpenBankingListAccounts).register(OpenBankingGetAccount).register(OpenBankingSyncAccounts);
320
+ }
321
+ export {
322
+ registerOpenBankingAccountContracts,
323
+ openBankingAccountContracts,
324
+ OpenBankingSyncAccounts,
325
+ OpenBankingListAccounts,
326
+ OpenBankingGetAccount
327
+ };