@contractspec/integration.providers-impls 2.10.0 → 3.1.1

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 (138) hide show
  1. package/README.md +66 -10
  2. package/dist/impls/async-event-queue.d.ts +8 -0
  3. package/dist/impls/async-event-queue.js +49 -0
  4. package/dist/impls/composio-fallback-resolver.d.ts +34 -0
  5. package/dist/impls/composio-fallback-resolver.js +580 -0
  6. package/dist/impls/composio-mcp.d.ts +22 -0
  7. package/dist/impls/composio-mcp.js +164 -0
  8. package/dist/impls/composio-proxies.d.ts +60 -0
  9. package/dist/impls/composio-proxies.js +311 -0
  10. package/dist/impls/composio-sdk.d.ts +25 -0
  11. package/dist/impls/composio-sdk.js +78 -0
  12. package/dist/impls/composio-types.d.ts +43 -0
  13. package/dist/impls/composio-types.js +54 -0
  14. package/dist/impls/elevenlabs-voice.js +2 -0
  15. package/dist/impls/fal-voice.js +2 -0
  16. package/dist/impls/fathom-meeting-recorder.js +2 -0
  17. package/dist/impls/fathom-meeting-recorder.mapper.js +2 -0
  18. package/dist/impls/fathom-meeting-recorder.utils.js +2 -0
  19. package/dist/impls/fathom-meeting-recorder.webhooks.js +2 -0
  20. package/dist/impls/fireflies-meeting-recorder.js +2 -0
  21. package/dist/impls/fireflies-meeting-recorder.queries.js +2 -0
  22. package/dist/impls/fireflies-meeting-recorder.utils.js +2 -0
  23. package/dist/impls/gcs-storage.js +2 -0
  24. package/dist/impls/gmail-inbound.js +2 -0
  25. package/dist/impls/gmail-outbound.js +2 -0
  26. package/dist/impls/google-calendar.js +2 -0
  27. package/dist/impls/gradium-voice.js +2 -0
  28. package/dist/impls/granola-meeting-recorder.js +2 -0
  29. package/dist/impls/granola-meeting-recorder.mcp.js +2 -0
  30. package/dist/impls/health/base-health-provider.d.ts +64 -13
  31. package/dist/impls/health/base-health-provider.js +508 -156
  32. package/dist/impls/health/hybrid-health-providers.d.ts +34 -0
  33. package/dist/impls/health/hybrid-health-providers.js +1090 -0
  34. package/dist/impls/health/official-health-providers.d.ts +78 -0
  35. package/dist/impls/health/official-health-providers.js +970 -0
  36. package/dist/impls/health/provider-normalizers.d.ts +28 -0
  37. package/dist/impls/health/provider-normalizers.js +289 -0
  38. package/dist/impls/health/providers.d.ts +2 -39
  39. package/dist/impls/health/providers.js +897 -184
  40. package/dist/impls/health-provider-factory.js +1011 -196
  41. package/dist/impls/index.d.ts +11 -0
  42. package/dist/impls/index.js +2588 -259
  43. package/dist/impls/jira.js +2 -0
  44. package/dist/impls/linear.js +2 -0
  45. package/dist/impls/messaging-github.d.ts +17 -0
  46. package/dist/impls/messaging-github.js +112 -0
  47. package/dist/impls/messaging-slack.d.ts +14 -0
  48. package/dist/impls/messaging-slack.js +82 -0
  49. package/dist/impls/messaging-whatsapp-meta.d.ts +13 -0
  50. package/dist/impls/messaging-whatsapp-meta.js +54 -0
  51. package/dist/impls/messaging-whatsapp-twilio.d.ts +13 -0
  52. package/dist/impls/messaging-whatsapp-twilio.js +84 -0
  53. package/dist/impls/mistral-conversational.d.ts +23 -0
  54. package/dist/impls/mistral-conversational.js +478 -0
  55. package/dist/impls/mistral-conversational.session.d.ts +32 -0
  56. package/dist/impls/mistral-conversational.session.js +208 -0
  57. package/dist/impls/mistral-embedding.js +2 -0
  58. package/dist/impls/mistral-llm.js +2 -0
  59. package/dist/impls/mistral-stt.d.ts +17 -0
  60. package/dist/impls/mistral-stt.js +169 -0
  61. package/dist/impls/notion.js +2 -0
  62. package/dist/impls/posthog-reader.js +2 -0
  63. package/dist/impls/posthog-utils.js +2 -0
  64. package/dist/impls/posthog.js +2 -0
  65. package/dist/impls/postmark-email.js +2 -0
  66. package/dist/impls/powens-client.js +2 -0
  67. package/dist/impls/powens-openbanking.js +2 -0
  68. package/dist/impls/provider-factory.d.ts +29 -1
  69. package/dist/impls/provider-factory.js +1985 -249
  70. package/dist/impls/qdrant-vector.js +2 -0
  71. package/dist/impls/stripe-payments.js +3 -1
  72. package/dist/impls/supabase-psql.js +2 -0
  73. package/dist/impls/supabase-vector.js +2 -0
  74. package/dist/impls/tldv-meeting-recorder.js +2 -0
  75. package/dist/impls/twilio-sms.js +2 -0
  76. package/dist/index.d.ts +1 -0
  77. package/dist/index.js +2615 -283
  78. package/dist/messaging.d.ts +1 -0
  79. package/dist/messaging.js +3 -0
  80. package/dist/node/impls/async-event-queue.js +49 -0
  81. package/dist/node/impls/composio-fallback-resolver.js +580 -0
  82. package/dist/node/impls/composio-mcp.js +164 -0
  83. package/dist/node/impls/composio-proxies.js +311 -0
  84. package/dist/node/impls/composio-sdk.js +78 -0
  85. package/dist/node/impls/composio-types.js +54 -0
  86. package/dist/node/impls/elevenlabs-voice.js +3 -0
  87. package/dist/node/impls/fal-voice.js +3 -0
  88. package/dist/node/impls/fathom-meeting-recorder.js +3 -0
  89. package/dist/node/impls/fathom-meeting-recorder.mapper.js +3 -0
  90. package/dist/node/impls/fathom-meeting-recorder.utils.js +3 -0
  91. package/dist/node/impls/fathom-meeting-recorder.webhooks.js +3 -0
  92. package/dist/node/impls/fireflies-meeting-recorder.js +3 -0
  93. package/dist/node/impls/fireflies-meeting-recorder.queries.js +3 -0
  94. package/dist/node/impls/fireflies-meeting-recorder.utils.js +3 -0
  95. package/dist/node/impls/gcs-storage.js +3 -0
  96. package/dist/node/impls/gmail-inbound.js +3 -0
  97. package/dist/node/impls/gmail-outbound.js +3 -0
  98. package/dist/node/impls/google-calendar.js +3 -0
  99. package/dist/node/impls/gradium-voice.js +3 -0
  100. package/dist/node/impls/granola-meeting-recorder.js +3 -0
  101. package/dist/node/impls/granola-meeting-recorder.mcp.js +3 -0
  102. package/dist/node/impls/health/base-health-provider.js +509 -156
  103. package/dist/node/impls/health/hybrid-health-providers.js +1090 -0
  104. package/dist/node/impls/health/official-health-providers.js +970 -0
  105. package/dist/node/impls/health/provider-normalizers.js +289 -0
  106. package/dist/node/impls/health/providers.js +898 -184
  107. package/dist/node/impls/health-provider-factory.js +1012 -196
  108. package/dist/node/impls/index.js +2589 -259
  109. package/dist/node/impls/jira.js +3 -0
  110. package/dist/node/impls/linear.js +3 -0
  111. package/dist/node/impls/messaging-github.js +112 -0
  112. package/dist/node/impls/messaging-slack.js +82 -0
  113. package/dist/node/impls/messaging-whatsapp-meta.js +54 -0
  114. package/dist/node/impls/messaging-whatsapp-twilio.js +84 -0
  115. package/dist/node/impls/mistral-conversational.js +478 -0
  116. package/dist/node/impls/mistral-conversational.session.js +208 -0
  117. package/dist/node/impls/mistral-embedding.js +3 -0
  118. package/dist/node/impls/mistral-llm.js +3 -0
  119. package/dist/node/impls/mistral-stt.js +169 -0
  120. package/dist/node/impls/notion.js +3 -0
  121. package/dist/node/impls/posthog-reader.js +3 -0
  122. package/dist/node/impls/posthog-utils.js +3 -0
  123. package/dist/node/impls/posthog.js +3 -0
  124. package/dist/node/impls/postmark-email.js +3 -0
  125. package/dist/node/impls/powens-client.js +3 -0
  126. package/dist/node/impls/powens-openbanking.js +3 -0
  127. package/dist/node/impls/provider-factory.js +1986 -249
  128. package/dist/node/impls/qdrant-vector.js +3 -0
  129. package/dist/node/impls/stripe-payments.js +4 -1
  130. package/dist/node/impls/supabase-psql.js +3 -0
  131. package/dist/node/impls/supabase-vector.js +3 -0
  132. package/dist/node/impls/tldv-meeting-recorder.js +3 -0
  133. package/dist/node/impls/twilio-sms.js +3 -0
  134. package/dist/node/index.js +2616 -283
  135. package/dist/node/messaging.js +2 -0
  136. package/dist/node/secrets/provider.js +3 -0
  137. package/dist/secrets/provider.js +2 -0
  138. package/package.json +219 -14
@@ -0,0 +1,289 @@
1
+ import { createRequire } from "node:module";
2
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
+
4
+ // src/impls/health/provider-normalizers.ts
5
+ var DEFAULT_LIST_KEYS = [
6
+ "items",
7
+ "data",
8
+ "records",
9
+ "activities",
10
+ "workouts",
11
+ "sleep",
12
+ "biometrics",
13
+ "nutrition"
14
+ ];
15
+ function asRecord(value) {
16
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
17
+ return;
18
+ }
19
+ return value;
20
+ }
21
+ function asArray(value) {
22
+ return Array.isArray(value) ? value : undefined;
23
+ }
24
+ function readString(record, keys) {
25
+ if (!record)
26
+ return;
27
+ for (const key of keys) {
28
+ const value = record[key];
29
+ if (typeof value === "string" && value.trim().length > 0) {
30
+ return value;
31
+ }
32
+ }
33
+ return;
34
+ }
35
+ function readNumber(record, keys) {
36
+ if (!record)
37
+ return;
38
+ for (const key of keys) {
39
+ const value = record[key];
40
+ if (typeof value === "number" && Number.isFinite(value)) {
41
+ return value;
42
+ }
43
+ if (typeof value === "string" && value.trim().length > 0) {
44
+ const parsed = Number(value);
45
+ if (Number.isFinite(parsed)) {
46
+ return parsed;
47
+ }
48
+ }
49
+ }
50
+ return;
51
+ }
52
+ function readBoolean(record, keys) {
53
+ if (!record)
54
+ return;
55
+ for (const key of keys) {
56
+ const value = record[key];
57
+ if (typeof value === "boolean") {
58
+ return value;
59
+ }
60
+ }
61
+ return;
62
+ }
63
+ function extractList(payload, listKeys = DEFAULT_LIST_KEYS) {
64
+ const root = asRecord(payload);
65
+ if (!root) {
66
+ return asArray(payload)?.map((item) => asRecord(item)).filter((item) => Boolean(item)) ?? [];
67
+ }
68
+ for (const key of listKeys) {
69
+ const arrayValue = asArray(root[key]);
70
+ if (!arrayValue)
71
+ continue;
72
+ return arrayValue.map((item) => asRecord(item)).filter((item) => Boolean(item));
73
+ }
74
+ return [];
75
+ }
76
+ function extractPagination(payload) {
77
+ const root = asRecord(payload);
78
+ const nestedPagination = asRecord(root?.pagination);
79
+ const nextCursor = readString(nestedPagination, ["nextCursor", "next_cursor"]) ?? readString(root, [
80
+ "nextCursor",
81
+ "next_cursor",
82
+ "cursor",
83
+ "next_page_token"
84
+ ]);
85
+ const hasMore = readBoolean(nestedPagination, ["hasMore", "has_more"]) ?? readBoolean(root, ["hasMore", "has_more"]);
86
+ return {
87
+ nextCursor,
88
+ hasMore: hasMore ?? Boolean(nextCursor)
89
+ };
90
+ }
91
+ function toHealthActivity(item, context, fallbackType = "activity") {
92
+ const externalId = readString(item, ["external_id", "externalId", "uuid", "id"]) ?? `${context.providerKey}:${fallbackType}`;
93
+ const id = readString(item, ["id", "uuid", "workout_id"]) ?? `${context.providerKey}:activity:${externalId}`;
94
+ return {
95
+ id,
96
+ externalId,
97
+ tenantId: context.tenantId,
98
+ connectionId: context.connectionId ?? "unknown",
99
+ userId: readString(item, ["user_id", "userId", "athlete_id"]),
100
+ providerKey: context.providerKey,
101
+ activityType: readString(item, ["activity_type", "type", "sport_type", "sport"]) ?? fallbackType,
102
+ startedAt: readIsoDate(item, [
103
+ "started_at",
104
+ "start_time",
105
+ "start_date",
106
+ "created_at"
107
+ ]),
108
+ endedAt: readIsoDate(item, ["ended_at", "end_time"]),
109
+ durationSeconds: readNumber(item, [
110
+ "duration_seconds",
111
+ "duration",
112
+ "elapsed_time"
113
+ ]),
114
+ distanceMeters: readNumber(item, ["distance_meters", "distance"]),
115
+ caloriesKcal: readNumber(item, [
116
+ "calories_kcal",
117
+ "calories",
118
+ "active_kilocalories"
119
+ ]),
120
+ steps: readNumber(item, ["steps"])?.valueOf(),
121
+ metadata: item
122
+ };
123
+ }
124
+ function toHealthWorkout(item, context, fallbackType = "workout") {
125
+ const activity = toHealthActivity(item, context, fallbackType);
126
+ return {
127
+ id: activity.id,
128
+ externalId: activity.externalId,
129
+ tenantId: activity.tenantId,
130
+ connectionId: activity.connectionId,
131
+ userId: activity.userId,
132
+ providerKey: activity.providerKey,
133
+ workoutType: readString(item, [
134
+ "workout_type",
135
+ "sport_type",
136
+ "type",
137
+ "activity_type"
138
+ ]) ?? fallbackType,
139
+ startedAt: activity.startedAt,
140
+ endedAt: activity.endedAt,
141
+ durationSeconds: activity.durationSeconds,
142
+ distanceMeters: activity.distanceMeters,
143
+ caloriesKcal: activity.caloriesKcal,
144
+ averageHeartRateBpm: readNumber(item, [
145
+ "average_heart_rate",
146
+ "avg_hr",
147
+ "average_heart_rate_bpm"
148
+ ]),
149
+ maxHeartRateBpm: readNumber(item, [
150
+ "max_heart_rate",
151
+ "max_hr",
152
+ "max_heart_rate_bpm"
153
+ ]),
154
+ metadata: item
155
+ };
156
+ }
157
+ function toHealthSleep(item, context) {
158
+ const externalId = readString(item, ["external_id", "externalId", "uuid", "id"]) ?? `${context.providerKey}:sleep`;
159
+ const id = readString(item, ["id", "uuid"]) ?? `${context.providerKey}:sleep:${externalId}`;
160
+ const startedAt = readIsoDate(item, ["started_at", "start_time", "bedtime_start", "start"]) ?? new Date(0).toISOString();
161
+ const endedAt = readIsoDate(item, ["ended_at", "end_time", "bedtime_end", "end"]) ?? startedAt;
162
+ return {
163
+ id,
164
+ externalId,
165
+ tenantId: context.tenantId,
166
+ connectionId: context.connectionId ?? "unknown",
167
+ userId: readString(item, ["user_id", "userId"]),
168
+ providerKey: context.providerKey,
169
+ startedAt,
170
+ endedAt,
171
+ durationSeconds: readNumber(item, [
172
+ "duration_seconds",
173
+ "duration",
174
+ "total_sleep_duration"
175
+ ]),
176
+ deepSleepSeconds: readNumber(item, [
177
+ "deep_sleep_seconds",
178
+ "deep_sleep_duration"
179
+ ]),
180
+ lightSleepSeconds: readNumber(item, [
181
+ "light_sleep_seconds",
182
+ "light_sleep_duration"
183
+ ]),
184
+ remSleepSeconds: readNumber(item, [
185
+ "rem_sleep_seconds",
186
+ "rem_sleep_duration"
187
+ ]),
188
+ awakeSeconds: readNumber(item, ["awake_seconds", "awake_time"]),
189
+ sleepScore: readNumber(item, ["sleep_score", "score"]),
190
+ metadata: item
191
+ };
192
+ }
193
+ function toHealthBiometric(item, context, metricTypeFallback = "metric") {
194
+ const externalId = readString(item, ["external_id", "externalId", "uuid", "id"]) ?? `${context.providerKey}:biometric`;
195
+ const id = readString(item, ["id", "uuid"]) ?? `${context.providerKey}:biometric:${externalId}`;
196
+ return {
197
+ id,
198
+ externalId,
199
+ tenantId: context.tenantId,
200
+ connectionId: context.connectionId ?? "unknown",
201
+ userId: readString(item, ["user_id", "userId"]),
202
+ providerKey: context.providerKey,
203
+ metricType: readString(item, ["metric_type", "metric", "type", "name"]) ?? metricTypeFallback,
204
+ value: readNumber(item, ["value", "score", "measurement"]) ?? 0,
205
+ unit: readString(item, ["unit"]),
206
+ measuredAt: readIsoDate(item, ["measured_at", "timestamp", "created_at"]) ?? new Date().toISOString(),
207
+ metadata: item
208
+ };
209
+ }
210
+ function toHealthNutrition(item, context) {
211
+ const externalId = readString(item, ["external_id", "externalId", "uuid", "id"]) ?? `${context.providerKey}:nutrition`;
212
+ const id = readString(item, ["id", "uuid"]) ?? `${context.providerKey}:nutrition:${externalId}`;
213
+ return {
214
+ id,
215
+ externalId,
216
+ tenantId: context.tenantId,
217
+ connectionId: context.connectionId ?? "unknown",
218
+ userId: readString(item, ["user_id", "userId"]),
219
+ providerKey: context.providerKey,
220
+ loggedAt: readIsoDate(item, ["logged_at", "created_at", "date", "timestamp"]) ?? new Date().toISOString(),
221
+ caloriesKcal: readNumber(item, ["calories_kcal", "calories"]),
222
+ proteinGrams: readNumber(item, ["protein_grams", "protein"]),
223
+ carbsGrams: readNumber(item, ["carbs_grams", "carbs"]),
224
+ fatGrams: readNumber(item, ["fat_grams", "fat"]),
225
+ fiberGrams: readNumber(item, ["fiber_grams", "fiber"]),
226
+ hydrationMl: readNumber(item, ["hydration_ml", "water_ml", "water"]),
227
+ metadata: item
228
+ };
229
+ }
230
+ function toHealthConnectionStatus(payload, params, source) {
231
+ const record = asRecord(payload);
232
+ const rawStatus = readString(record, ["status", "connection_status", "health"]) ?? "healthy";
233
+ return {
234
+ tenantId: params.tenantId,
235
+ connectionId: params.connectionId,
236
+ status: rawStatus === "healthy" || rawStatus === "degraded" || rawStatus === "error" || rawStatus === "disconnected" ? rawStatus : "healthy",
237
+ source,
238
+ lastCheckedAt: readIsoDate(record, ["last_checked_at", "lastCheckedAt"]) ?? new Date().toISOString(),
239
+ errorCode: readString(record, ["error_code", "errorCode"]),
240
+ errorMessage: readString(record, ["error_message", "errorMessage"]),
241
+ metadata: asRecord(record?.metadata)
242
+ };
243
+ }
244
+ function toHealthWebhookEvent(payload, providerKey, verified) {
245
+ const record = asRecord(payload);
246
+ const entityType = readString(record, ["entity_type", "entityType", "type"]);
247
+ const normalizedEntityType = entityType === "activity" || entityType === "workout" || entityType === "sleep" || entityType === "biometric" || entityType === "nutrition" ? entityType : undefined;
248
+ return {
249
+ providerKey,
250
+ eventType: readString(record, ["event_type", "eventType", "event"]),
251
+ externalEntityId: readString(record, [
252
+ "external_entity_id",
253
+ "externalEntityId",
254
+ "entity_id",
255
+ "entityId",
256
+ "id"
257
+ ]),
258
+ entityType: normalizedEntityType,
259
+ receivedAt: new Date().toISOString(),
260
+ verified,
261
+ payload,
262
+ metadata: asRecord(record?.metadata)
263
+ };
264
+ }
265
+ function readIsoDate(record, keys) {
266
+ const value = readString(record, keys);
267
+ if (!value)
268
+ return;
269
+ const parsed = new Date(value);
270
+ if (Number.isNaN(parsed.getTime()))
271
+ return;
272
+ return parsed.toISOString();
273
+ }
274
+ export {
275
+ toHealthWorkout,
276
+ toHealthWebhookEvent,
277
+ toHealthSleep,
278
+ toHealthNutrition,
279
+ toHealthConnectionStatus,
280
+ toHealthBiometric,
281
+ toHealthActivity,
282
+ readString,
283
+ readNumber,
284
+ readBoolean,
285
+ extractPagination,
286
+ extractList,
287
+ asRecord,
288
+ asArray
289
+ };