@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,644 @@
1
+ // @bun
2
+ // src/integrations/openbanking/models.ts
3
+ import { ScalarTypeEnum, SchemaModel } from "@contractspec/lib.schema";
4
+ var BankAccountRecord = new SchemaModel({
5
+ name: "BankAccountRecord",
6
+ description: "Canonical representation of a bank account synced from an open banking provider.",
7
+ fields: {
8
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
9
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
10
+ userId: { type: ScalarTypeEnum.ID(), isOptional: false },
11
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
12
+ externalId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
13
+ institutionId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
14
+ institutionName: {
15
+ type: ScalarTypeEnum.NonEmptyString(),
16
+ isOptional: false
17
+ },
18
+ institutionLogoUrl: { type: ScalarTypeEnum.URL(), isOptional: true },
19
+ iban: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
20
+ bic: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
21
+ accountType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
22
+ currency: { type: ScalarTypeEnum.Currency(), isOptional: false },
23
+ displayName: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
24
+ accountNumberMasked: {
25
+ type: ScalarTypeEnum.String_unsecure(),
26
+ isOptional: true
27
+ },
28
+ productCode: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
29
+ balance: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
30
+ availableBalance: {
31
+ type: ScalarTypeEnum.Float_unsecure(),
32
+ isOptional: true
33
+ },
34
+ lastSyncedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
35
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
36
+ updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
37
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
38
+ }
39
+ });
40
+ var BankTransactionRecord = new SchemaModel({
41
+ name: "BankTransactionRecord",
42
+ description: "Canonical transaction entry mapped from Powens into the open banking ledger.",
43
+ fields: {
44
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
45
+ accountId: { type: ScalarTypeEnum.ID(), isOptional: false },
46
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
47
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
48
+ externalId: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
49
+ amount: { type: ScalarTypeEnum.Float_unsecure(), isOptional: false },
50
+ currency: { type: ScalarTypeEnum.Currency(), isOptional: false },
51
+ date: { type: ScalarTypeEnum.DateTime(), isOptional: false },
52
+ bookingDate: { type: ScalarTypeEnum.DateTime(), isOptional: true },
53
+ valueDate: { type: ScalarTypeEnum.DateTime(), isOptional: true },
54
+ description: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
55
+ counterpartyName: {
56
+ type: ScalarTypeEnum.String_unsecure(),
57
+ isOptional: true
58
+ },
59
+ counterpartyAccount: {
60
+ type: ScalarTypeEnum.String_unsecure(),
61
+ isOptional: true
62
+ },
63
+ merchantCategoryCode: {
64
+ type: ScalarTypeEnum.String_unsecure(),
65
+ isOptional: true
66
+ },
67
+ rawCategory: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },
68
+ standardizedCategory: {
69
+ type: ScalarTypeEnum.String_unsecure(),
70
+ isOptional: true
71
+ },
72
+ transactionType: {
73
+ type: ScalarTypeEnum.NonEmptyString(),
74
+ isOptional: false
75
+ },
76
+ status: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
77
+ runningBalance: { type: ScalarTypeEnum.Float_unsecure(), isOptional: true },
78
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true },
79
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
80
+ updatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false }
81
+ }
82
+ });
83
+ var AccountBalanceRecord = new SchemaModel({
84
+ name: "AccountBalanceRecord",
85
+ description: "Canonical balance snapshot computed from Powens balance payloads.",
86
+ fields: {
87
+ id: { type: ScalarTypeEnum.ID(), isOptional: false },
88
+ accountId: { type: ScalarTypeEnum.ID(), isOptional: false },
89
+ tenantId: { type: ScalarTypeEnum.ID(), isOptional: false },
90
+ connectionId: { type: ScalarTypeEnum.ID(), isOptional: false },
91
+ balanceType: { type: ScalarTypeEnum.NonEmptyString(), isOptional: false },
92
+ currentBalance: {
93
+ type: ScalarTypeEnum.Float_unsecure(),
94
+ isOptional: false
95
+ },
96
+ availableBalance: {
97
+ type: ScalarTypeEnum.Float_unsecure(),
98
+ isOptional: true
99
+ },
100
+ currency: { type: ScalarTypeEnum.Currency(), isOptional: false },
101
+ lastUpdatedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
102
+ createdAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },
103
+ metadata: { type: ScalarTypeEnum.JSONObject(), isOptional: true }
104
+ }
105
+ });
106
+
107
+ // src/integrations/openbanking/telemetry.ts
108
+ var OPENBANKING_PII_FIELDS = [
109
+ "iban",
110
+ "bic",
111
+ "accountNumberMasked",
112
+ "accountNumber",
113
+ "counterpartyName",
114
+ "counterpartyAccount",
115
+ "description",
116
+ "merchantName",
117
+ "merchantCategoryCode",
118
+ "reference"
119
+ ];
120
+ var OPENBANKING_TELEMETRY_EVENTS = {
121
+ accountsSynced: "openbanking.accounts.synced",
122
+ accountsSyncFailed: "openbanking.accounts.sync_failed",
123
+ transactionsSynced: "openbanking.transactions.synced",
124
+ transactionsSyncFailed: "openbanking.transactions.sync_failed",
125
+ balancesRefreshed: "openbanking.balances.refreshed",
126
+ balancesRefreshFailed: "openbanking.balances.refresh_failed",
127
+ overviewGenerated: "openbanking.overview.generated"
128
+ };
129
+ function redactOpenBankingTelemetryPayload(payload) {
130
+ const redacted = {};
131
+ for (const [key, value] of Object.entries(payload)) {
132
+ if (OPENBANKING_PII_FIELDS.includes(key)) {
133
+ redacted[key] = maskValue(value);
134
+ } else if (Array.isArray(value)) {
135
+ redacted[key] = value.map((item) => typeof item === "object" && item !== null ? redactOpenBankingTelemetryPayload(item) : item);
136
+ } else if (typeof value === "object" && value !== null) {
137
+ redacted[key] = redactOpenBankingTelemetryPayload(value);
138
+ } else {
139
+ redacted[key] = value;
140
+ }
141
+ }
142
+ return redacted;
143
+ }
144
+ function maskValue(value) {
145
+ if (value == null)
146
+ return "";
147
+ const str = String(value);
148
+ if (str.length <= 4)
149
+ return "*".repeat(str.length);
150
+ return `${"*".repeat(Math.max(str.length - 4, 0))}${str.slice(-4)}`;
151
+ }
152
+
153
+ // src/integrations/openbanking/contracts/accounts.ts
154
+ import { ScalarTypeEnum as ScalarTypeEnum2, SchemaModel as SchemaModel2 } from "@contractspec/lib.schema";
155
+ import {
156
+ defineCommand,
157
+ defineQuery
158
+ } from "@contractspec/lib.contracts-spec/operations";
159
+ var OpenBankingListAccountsInput = new SchemaModel2({
160
+ name: "OpenBankingListAccountsInput",
161
+ description: "Parameters for listing bank accounts through the open banking provider.",
162
+ fields: {
163
+ tenantId: { type: ScalarTypeEnum2.ID(), isOptional: false },
164
+ userId: { type: ScalarTypeEnum2.ID(), isOptional: false },
165
+ connectionId: { type: ScalarTypeEnum2.ID(), isOptional: true },
166
+ includeBalances: { type: ScalarTypeEnum2.Boolean(), isOptional: true },
167
+ institutionId: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
168
+ cursor: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
169
+ pageSize: { type: ScalarTypeEnum2.Int_unsecure(), isOptional: true }
170
+ }
171
+ });
172
+ var OpenBankingListAccountsOutput = new SchemaModel2({
173
+ name: "OpenBankingListAccountsOutput",
174
+ description: "Paginated list of bank accounts available to the tenant and user.",
175
+ fields: {
176
+ accounts: {
177
+ type: BankAccountRecord,
178
+ isOptional: false,
179
+ isArray: true
180
+ },
181
+ nextCursor: { type: ScalarTypeEnum2.String_unsecure(), isOptional: true },
182
+ hasMore: { type: ScalarTypeEnum2.Boolean(), isOptional: true }
183
+ }
184
+ });
185
+ var OpenBankingGetAccountInput = new SchemaModel2({
186
+ name: "OpenBankingGetAccountInput",
187
+ description: "Parameters for retrieving a specific bank account.",
188
+ fields: {
189
+ tenantId: { type: ScalarTypeEnum2.ID(), isOptional: false },
190
+ accountId: { type: ScalarTypeEnum2.ID(), isOptional: false },
191
+ includeBalances: { type: ScalarTypeEnum2.Boolean(), isOptional: true },
192
+ includeLatestTransactions: {
193
+ type: ScalarTypeEnum2.Boolean(),
194
+ isOptional: true
195
+ }
196
+ }
197
+ });
198
+ var OpenBankingSyncAccountsInput = new SchemaModel2({
199
+ name: "OpenBankingSyncAccountsInput",
200
+ description: "Command payload to trigger an account synchronisation against the open banking provider.",
201
+ fields: {
202
+ tenantId: { type: ScalarTypeEnum2.ID(), isOptional: false },
203
+ userId: { type: ScalarTypeEnum2.ID(), isOptional: true },
204
+ connectionId: { type: ScalarTypeEnum2.ID(), isOptional: false },
205
+ accountIds: {
206
+ type: ScalarTypeEnum2.ID(),
207
+ isArray: true,
208
+ isOptional: true
209
+ },
210
+ forceFullRefresh: { type: ScalarTypeEnum2.Boolean(), isOptional: true },
211
+ triggerWorkflows: { type: ScalarTypeEnum2.Boolean(), isOptional: true }
212
+ }
213
+ });
214
+ var OpenBankingSyncAccountsOutput = new SchemaModel2({
215
+ name: "OpenBankingSyncAccountsOutput",
216
+ description: "Result of a bank account synchronisation run.",
217
+ fields: {
218
+ synced: { type: ScalarTypeEnum2.Int_unsecure(), isOptional: false },
219
+ failed: { type: ScalarTypeEnum2.Int_unsecure(), isOptional: false },
220
+ errors: {
221
+ type: ScalarTypeEnum2.String_unsecure(),
222
+ isArray: true,
223
+ isOptional: true
224
+ },
225
+ nextSyncSuggestedAt: {
226
+ type: ScalarTypeEnum2.DateTime(),
227
+ isOptional: true
228
+ }
229
+ }
230
+ });
231
+ var OpenBankingListAccounts = defineQuery({
232
+ meta: {
233
+ key: "openbanking.accounts.list",
234
+ version: "1.0.0",
235
+ description: "List bank accounts available to a tenant/user via Powens Open Banking.",
236
+ goal: "Provide downstream workflows with the set of accounts accessible via the configured open banking connection.",
237
+ context: "Used by Pocket Family Office dashboards and sync workflows to enumerate bank accounts prior to syncing balances or transactions.",
238
+ owners: ["@platform.finance"],
239
+ tags: ["open-banking", "powens", "accounts"],
240
+ stability: "experimental"
241
+ },
242
+ io: {
243
+ input: OpenBankingListAccountsInput,
244
+ output: OpenBankingListAccountsOutput
245
+ },
246
+ policy: {
247
+ auth: "user"
248
+ }
249
+ });
250
+ var OpenBankingGetAccount = defineQuery({
251
+ meta: {
252
+ key: "openbanking.accounts.get",
253
+ version: "1.0.0",
254
+ description: "Retrieve the canonical bank account record for the given account identifier.",
255
+ goal: "Allow user-facing experiences and automations to display up-to-date account metadata.",
256
+ context: "Invoked by UI surfaces and workflow automation steps that require detailed metadata for a specific bank account.",
257
+ owners: ["@platform.finance"],
258
+ tags: ["open-banking", "powens", "accounts"],
259
+ stability: "experimental"
260
+ },
261
+ io: {
262
+ input: OpenBankingGetAccountInput,
263
+ output: BankAccountRecord
264
+ },
265
+ policy: {
266
+ auth: "user"
267
+ }
268
+ });
269
+ var OpenBankingSyncAccounts = defineCommand({
270
+ meta: {
271
+ key: "openbanking.accounts.sync",
272
+ version: "1.0.0",
273
+ description: "Initiate a synchronisation run to refresh bank account metadata from Powens.",
274
+ goal: "Keep canonical bank account records aligned with the external open banking provider.",
275
+ context: "Triggered by scheduled workflows or manual operator actions to reconcile account metadata prior to transaction/balance syncs.",
276
+ owners: ["@platform.finance"],
277
+ tags: ["open-banking", "powens", "accounts"],
278
+ stability: "experimental"
279
+ },
280
+ io: {
281
+ input: OpenBankingSyncAccountsInput,
282
+ output: OpenBankingSyncAccountsOutput
283
+ },
284
+ policy: {
285
+ auth: "admin"
286
+ },
287
+ telemetry: {
288
+ success: {
289
+ event: { key: OPENBANKING_TELEMETRY_EVENTS.accountsSynced },
290
+ properties: ({ input, output }) => {
291
+ const payload = input;
292
+ const result = output;
293
+ return {
294
+ tenantId: payload?.tenantId,
295
+ connectionId: payload?.connectionId,
296
+ synced: result?.synced,
297
+ failed: result?.failed
298
+ };
299
+ }
300
+ },
301
+ failure: {
302
+ event: { key: OPENBANKING_TELEMETRY_EVENTS.accountsSyncFailed },
303
+ properties: ({ input, error }) => {
304
+ const payload = input;
305
+ return {
306
+ tenantId: payload?.tenantId,
307
+ connectionId: payload?.connectionId,
308
+ error: error instanceof Error ? error.message : String(error ?? "unknown")
309
+ };
310
+ }
311
+ }
312
+ }
313
+ });
314
+ var openBankingAccountContracts = {
315
+ OpenBankingListAccounts,
316
+ OpenBankingGetAccount,
317
+ OpenBankingSyncAccounts
318
+ };
319
+ function registerOpenBankingAccountContracts(registry) {
320
+ return registry.register(OpenBankingListAccounts).register(OpenBankingGetAccount).register(OpenBankingSyncAccounts);
321
+ }
322
+
323
+ // src/integrations/openbanking/contracts/transactions.ts
324
+ import { ScalarTypeEnum as ScalarTypeEnum3, SchemaModel as SchemaModel3 } from "@contractspec/lib.schema";
325
+ import {
326
+ defineCommand as defineCommand2,
327
+ defineQuery as defineQuery2
328
+ } from "@contractspec/lib.contracts-spec/operations";
329
+ var OpenBankingListTransactionsInput = new SchemaModel3({
330
+ name: "OpenBankingListTransactionsInput",
331
+ description: "Parameters for listing bank transactions from the canonical ledger.",
332
+ fields: {
333
+ tenantId: { type: ScalarTypeEnum3.ID(), isOptional: false },
334
+ accountId: { type: ScalarTypeEnum3.ID(), isOptional: false },
335
+ from: { type: ScalarTypeEnum3.DateTime(), isOptional: true },
336
+ to: { type: ScalarTypeEnum3.DateTime(), isOptional: true },
337
+ cursor: { type: ScalarTypeEnum3.String_unsecure(), isOptional: true },
338
+ pageSize: { type: ScalarTypeEnum3.Int_unsecure(), isOptional: true },
339
+ direction: { type: ScalarTypeEnum3.String_unsecure(), isOptional: true },
340
+ minimumAmount: { type: ScalarTypeEnum3.Float_unsecure(), isOptional: true },
341
+ maximumAmount: { type: ScalarTypeEnum3.Float_unsecure(), isOptional: true },
342
+ category: { type: ScalarTypeEnum3.String_unsecure(), isOptional: true }
343
+ }
344
+ });
345
+ var OpenBankingListTransactionsOutput = new SchemaModel3({
346
+ name: "OpenBankingListTransactionsOutput",
347
+ description: "Paginated list of transactions for a bank account.",
348
+ fields: {
349
+ transactions: {
350
+ type: BankTransactionRecord,
351
+ isOptional: false,
352
+ isArray: true
353
+ },
354
+ nextCursor: { type: ScalarTypeEnum3.String_unsecure(), isOptional: true },
355
+ hasMore: { type: ScalarTypeEnum3.Boolean(), isOptional: true }
356
+ }
357
+ });
358
+ var OpenBankingSyncTransactionsInput = new SchemaModel3({
359
+ name: "OpenBankingSyncTransactionsInput",
360
+ description: "Command payload to synchronise transactions from the open banking provider into the canonical ledger.",
361
+ fields: {
362
+ tenantId: { type: ScalarTypeEnum3.ID(), isOptional: false },
363
+ accountId: { type: ScalarTypeEnum3.ID(), isOptional: false },
364
+ from: { type: ScalarTypeEnum3.DateTime(), isOptional: true },
365
+ to: { type: ScalarTypeEnum3.DateTime(), isOptional: true },
366
+ connectionId: { type: ScalarTypeEnum3.ID(), isOptional: true },
367
+ includePending: { type: ScalarTypeEnum3.Boolean(), isOptional: true },
368
+ backfillDays: { type: ScalarTypeEnum3.Int_unsecure(), isOptional: true }
369
+ }
370
+ });
371
+ var OpenBankingSyncTransactionsOutput = new SchemaModel3({
372
+ name: "OpenBankingSyncTransactionsOutput",
373
+ description: "Result of a transaction synchronisation run.",
374
+ fields: {
375
+ synced: { type: ScalarTypeEnum3.Int_unsecure(), isOptional: false },
376
+ failed: { type: ScalarTypeEnum3.Int_unsecure(), isOptional: false },
377
+ earliestSyncedAt: { type: ScalarTypeEnum3.DateTime(), isOptional: true },
378
+ latestSyncedAt: { type: ScalarTypeEnum3.DateTime(), isOptional: true },
379
+ nextSinceToken: {
380
+ type: ScalarTypeEnum3.String_unsecure(),
381
+ isOptional: true
382
+ },
383
+ errors: {
384
+ type: ScalarTypeEnum3.String_unsecure(),
385
+ isArray: true,
386
+ isOptional: true
387
+ }
388
+ }
389
+ });
390
+ var OpenBankingListTransactions = defineQuery2({
391
+ meta: {
392
+ key: "openbanking.transactions.list",
393
+ version: "1.0.0",
394
+ description: "List bank transactions that have been normalised into the canonical ledger.",
395
+ goal: "Allow downstream analytics and UI surfaces to page through canonical bank transactions.",
396
+ context: "Used by Pocket Family Office dashboards, reconciliation workflows, and analytics data views.",
397
+ owners: ["@platform.finance"],
398
+ tags: ["open-banking", "powens", "transactions"],
399
+ stability: "experimental"
400
+ },
401
+ io: {
402
+ input: OpenBankingListTransactionsInput,
403
+ output: OpenBankingListTransactionsOutput
404
+ },
405
+ policy: {
406
+ auth: "user"
407
+ }
408
+ });
409
+ var OpenBankingSyncTransactions = defineCommand2({
410
+ meta: {
411
+ key: "openbanking.transactions.sync",
412
+ version: "1.0.0",
413
+ description: "Synchronise transactions for a bank account by calling the configured open banking provider.",
414
+ goal: "Ensure the canonical transaction ledger stays aligned with the external provider.",
415
+ context: "Triggered by scheduled workflows or on-demand actions when activity is expected on an account.",
416
+ owners: ["@platform.finance"],
417
+ tags: ["open-banking", "powens", "transactions"],
418
+ stability: "experimental"
419
+ },
420
+ io: {
421
+ input: OpenBankingSyncTransactionsInput,
422
+ output: OpenBankingSyncTransactionsOutput
423
+ },
424
+ policy: {
425
+ auth: "admin"
426
+ },
427
+ telemetry: {
428
+ success: {
429
+ event: { key: OPENBANKING_TELEMETRY_EVENTS.transactionsSynced },
430
+ properties: ({ input, output }) => {
431
+ const payload = input;
432
+ const result = output;
433
+ return {
434
+ tenantId: payload?.tenantId,
435
+ accountId: payload?.accountId,
436
+ synced: result?.synced,
437
+ failed: result?.failed,
438
+ earliestSyncedAt: result?.earliestSyncedAt,
439
+ latestSyncedAt: result?.latestSyncedAt
440
+ };
441
+ }
442
+ },
443
+ failure: {
444
+ event: { key: OPENBANKING_TELEMETRY_EVENTS.transactionsSyncFailed },
445
+ properties: ({ input, error }) => {
446
+ const payload = input;
447
+ return {
448
+ tenantId: payload?.tenantId,
449
+ accountId: payload?.accountId,
450
+ error: error instanceof Error ? error.message : String(error ?? "unknown")
451
+ };
452
+ }
453
+ }
454
+ }
455
+ });
456
+ var openBankingTransactionContracts = {
457
+ OpenBankingListTransactions,
458
+ OpenBankingSyncTransactions
459
+ };
460
+ function registerOpenBankingTransactionContracts(registry) {
461
+ return registry.register(OpenBankingListTransactions).register(OpenBankingSyncTransactions);
462
+ }
463
+
464
+ // src/integrations/openbanking/contracts/balances.ts
465
+ import { ScalarTypeEnum as ScalarTypeEnum4, SchemaModel as SchemaModel4 } from "@contractspec/lib.schema";
466
+ import {
467
+ defineCommand as defineCommand3,
468
+ defineQuery as defineQuery3
469
+ } from "@contractspec/lib.contracts-spec/operations";
470
+ var OpenBankingGetBalancesInput = new SchemaModel4({
471
+ name: "OpenBankingGetBalancesInput",
472
+ description: "Parameters for retrieving bank account balances from the canonical ledger.",
473
+ fields: {
474
+ tenantId: { type: ScalarTypeEnum4.ID(), isOptional: false },
475
+ accountId: { type: ScalarTypeEnum4.ID(), isOptional: false },
476
+ balanceTypes: {
477
+ type: ScalarTypeEnum4.String_unsecure(),
478
+ isArray: true,
479
+ isOptional: true
480
+ }
481
+ }
482
+ });
483
+ var OpenBankingGetBalancesOutput = new SchemaModel4({
484
+ name: "OpenBankingGetBalancesOutput",
485
+ description: "Canonical balances for a bank account.",
486
+ fields: {
487
+ balances: {
488
+ type: AccountBalanceRecord,
489
+ isOptional: false,
490
+ isArray: true
491
+ },
492
+ asOf: { type: ScalarTypeEnum4.DateTime(), isOptional: true }
493
+ }
494
+ });
495
+ var OpenBankingRefreshBalancesInput = new SchemaModel4({
496
+ name: "OpenBankingRefreshBalancesInput",
497
+ description: "Command payload to refresh balances for a bank account via the open banking provider.",
498
+ fields: {
499
+ tenantId: { type: ScalarTypeEnum4.ID(), isOptional: false },
500
+ accountId: { type: ScalarTypeEnum4.ID(), isOptional: false },
501
+ connectionId: { type: ScalarTypeEnum4.ID(), isOptional: true },
502
+ balanceTypes: {
503
+ type: ScalarTypeEnum4.String_unsecure(),
504
+ isArray: true,
505
+ isOptional: true
506
+ },
507
+ forceRefresh: { type: ScalarTypeEnum4.Boolean(), isOptional: true }
508
+ }
509
+ });
510
+ var OpenBankingRefreshBalancesOutput = new SchemaModel4({
511
+ name: "OpenBankingRefreshBalancesOutput",
512
+ description: "Result of a balance refresh against the open banking provider.",
513
+ fields: {
514
+ balances: {
515
+ type: AccountBalanceRecord,
516
+ isOptional: false,
517
+ isArray: true
518
+ },
519
+ refreshedAt: { type: ScalarTypeEnum4.DateTime(), isOptional: false },
520
+ errors: {
521
+ type: ScalarTypeEnum4.String_unsecure(),
522
+ isArray: true,
523
+ isOptional: true
524
+ }
525
+ }
526
+ });
527
+ var OpenBankingGetBalances = defineQuery3({
528
+ meta: {
529
+ key: "openbanking.balances.get",
530
+ version: "1.0.0",
531
+ description: "Retrieve the latest cached balances for a bank account.",
532
+ goal: "Expose current and available balances required by dashboards and analytics.",
533
+ context: "Used by Pocket Family Office UI surfaces and automation steps that require balance totals prior to generating summaries.",
534
+ owners: ["@platform.finance"],
535
+ tags: ["open-banking", "powens", "balances"],
536
+ stability: "experimental"
537
+ },
538
+ io: {
539
+ input: OpenBankingGetBalancesInput,
540
+ output: OpenBankingGetBalancesOutput
541
+ },
542
+ policy: {
543
+ auth: "user"
544
+ }
545
+ });
546
+ var OpenBankingRefreshBalances = defineCommand3({
547
+ meta: {
548
+ key: "openbanking.balances.refresh",
549
+ version: "1.0.0",
550
+ description: "Refresh balances for a bank account via the configured open banking provider.",
551
+ goal: "Ensure canonical balance records reflect the latest values from Powens.",
552
+ context: "Triggered by scheduled workflows before generating summaries or forecasting cashflow.",
553
+ owners: ["@platform.finance"],
554
+ tags: ["open-banking", "powens", "balances"],
555
+ stability: "experimental"
556
+ },
557
+ io: {
558
+ input: OpenBankingRefreshBalancesInput,
559
+ output: OpenBankingRefreshBalancesOutput
560
+ },
561
+ policy: {
562
+ auth: "admin"
563
+ },
564
+ telemetry: {
565
+ success: {
566
+ event: { key: OPENBANKING_TELEMETRY_EVENTS.balancesRefreshed },
567
+ properties: ({ input, output }) => {
568
+ const payload = input;
569
+ const result = output;
570
+ return {
571
+ tenantId: payload?.tenantId,
572
+ accountId: payload?.accountId,
573
+ refreshedAt: result?.refreshedAt,
574
+ balanceCount: Array.isArray(result?.balances) ? result?.balances.length : undefined
575
+ };
576
+ }
577
+ },
578
+ failure: {
579
+ event: { key: OPENBANKING_TELEMETRY_EVENTS.balancesRefreshFailed },
580
+ properties: ({ input, error }) => {
581
+ const payload = input;
582
+ return {
583
+ tenantId: payload?.tenantId,
584
+ accountId: payload?.accountId,
585
+ error: error instanceof Error ? error.message : String(error ?? "unknown")
586
+ };
587
+ }
588
+ }
589
+ }
590
+ });
591
+ var openBankingBalanceContracts = {
592
+ OpenBankingGetBalances,
593
+ OpenBankingRefreshBalances
594
+ };
595
+ function registerOpenBankingBalanceContracts(registry) {
596
+ return registry.register(OpenBankingGetBalances).register(OpenBankingRefreshBalances);
597
+ }
598
+
599
+ // src/integrations/openbanking/openbanking.feature.ts
600
+ import { defineFeature } from "@contractspec/lib.contracts-spec/features";
601
+ var OpenBankingFeature = defineFeature({
602
+ meta: {
603
+ key: "openbanking",
604
+ version: "1.0.0",
605
+ title: "Open Banking Integration",
606
+ description: "Open banking account sync, balance refresh, and transaction synchronization",
607
+ domain: "integrations",
608
+ owners: ["@platform.finance"],
609
+ tags: ["open-banking", "powens", "finance", "banking"],
610
+ stability: "experimental"
611
+ },
612
+ operations: [
613
+ { key: "openbanking.accounts.sync", version: "1.0.0" },
614
+ { key: "openbanking.accounts.list", version: "1.0.0" },
615
+ { key: "openbanking.accounts.get", version: "1.0.0" },
616
+ { key: "openbanking.balances.refresh", version: "1.0.0" },
617
+ { key: "openbanking.balances.get", version: "1.0.0" },
618
+ { key: "openbanking.transactions.sync", version: "1.0.0" },
619
+ { key: "openbanking.transactions.list", version: "1.0.0" }
620
+ ],
621
+ events: [],
622
+ presentations: [],
623
+ opToPresentation: [],
624
+ presentationsTargets: [],
625
+ capabilities: {
626
+ provides: [{ key: "openbanking", version: "1.0.0" }],
627
+ requires: [{ key: "identity", version: "1.0.0" }]
628
+ }
629
+ });
630
+ // src/integrations/openbanking/contracts/index.ts
631
+ function registerOpenBankingContracts(registry) {
632
+ return registerOpenBankingBalanceContracts(registerOpenBankingTransactionContracts(registerOpenBankingAccountContracts(registry)));
633
+ }
634
+ export {
635
+ registerOpenBankingContracts,
636
+ OpenBankingSyncTransactions,
637
+ OpenBankingSyncAccounts,
638
+ OpenBankingRefreshBalances,
639
+ OpenBankingListTransactions,
640
+ OpenBankingListAccounts,
641
+ OpenBankingGetBalances,
642
+ OpenBankingGetAccount,
643
+ OpenBankingFeature
644
+ };