@contractspec/integration.providers-impls 1.56.1 → 1.57.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 (154) hide show
  1. package/README.md +115 -1
  2. package/dist/_virtual/{rolldown_runtime.js → _rolldown/runtime.js} +3 -3
  3. package/dist/analytics.d.ts +9 -0
  4. package/dist/analytics.d.ts.map +1 -0
  5. package/dist/analytics.js +3 -0
  6. package/dist/calendar.d.ts +1 -0
  7. package/dist/calendar.d.ts.map +1 -1
  8. package/dist/calendar.js +1 -1
  9. package/dist/database.d.ts +9 -0
  10. package/dist/database.d.ts.map +1 -0
  11. package/dist/database.js +3 -0
  12. package/dist/email.d.ts +1 -0
  13. package/dist/email.d.ts.map +1 -1
  14. package/dist/email.js +1 -1
  15. package/dist/embedding.d.ts +1 -0
  16. package/dist/embedding.d.ts.map +1 -1
  17. package/dist/embedding.js +1 -1
  18. package/dist/impls/elevenlabs-voice.d.ts.map +1 -1
  19. package/dist/impls/fal-voice.d.ts +29 -0
  20. package/dist/impls/fal-voice.d.ts.map +1 -0
  21. package/dist/impls/fal-voice.js +88 -0
  22. package/dist/impls/fal-voice.js.map +1 -0
  23. package/dist/impls/fathom-meeting-recorder.d.ts +42 -0
  24. package/dist/impls/fathom-meeting-recorder.d.ts.map +1 -0
  25. package/dist/impls/fathom-meeting-recorder.js +145 -0
  26. package/dist/impls/fathom-meeting-recorder.js.map +1 -0
  27. package/dist/impls/fathom-meeting-recorder.mapper.d.ts +9 -0
  28. package/dist/impls/fathom-meeting-recorder.mapper.d.ts.map +1 -0
  29. package/dist/impls/fathom-meeting-recorder.mapper.js +42 -0
  30. package/dist/impls/fathom-meeting-recorder.mapper.js.map +1 -0
  31. package/dist/impls/fathom-meeting-recorder.types.d.ts +24 -0
  32. package/dist/impls/fathom-meeting-recorder.types.d.ts.map +1 -0
  33. package/dist/impls/fathom-meeting-recorder.types.js +0 -0
  34. package/dist/impls/fathom-meeting-recorder.utils.d.ts +15 -0
  35. package/dist/impls/fathom-meeting-recorder.utils.d.ts.map +1 -0
  36. package/dist/impls/fathom-meeting-recorder.utils.js +56 -0
  37. package/dist/impls/fathom-meeting-recorder.utils.js.map +1 -0
  38. package/dist/impls/fathom-meeting-recorder.webhooks.d.ts +8 -0
  39. package/dist/impls/fathom-meeting-recorder.webhooks.d.ts.map +1 -0
  40. package/dist/impls/fathom-meeting-recorder.webhooks.js +25 -0
  41. package/dist/impls/fathom-meeting-recorder.webhooks.js.map +1 -0
  42. package/dist/impls/fireflies-meeting-recorder.d.ts +28 -0
  43. package/dist/impls/fireflies-meeting-recorder.d.ts.map +1 -0
  44. package/dist/impls/fireflies-meeting-recorder.js +152 -0
  45. package/dist/impls/fireflies-meeting-recorder.js.map +1 -0
  46. package/dist/impls/fireflies-meeting-recorder.queries.d.ts +7 -0
  47. package/dist/impls/fireflies-meeting-recorder.queries.d.ts.map +1 -0
  48. package/dist/impls/fireflies-meeting-recorder.queries.js +84 -0
  49. package/dist/impls/fireflies-meeting-recorder.queries.js.map +1 -0
  50. package/dist/impls/fireflies-meeting-recorder.types.d.ts +35 -0
  51. package/dist/impls/fireflies-meeting-recorder.types.d.ts.map +1 -0
  52. package/dist/impls/fireflies-meeting-recorder.types.js +0 -0
  53. package/dist/impls/fireflies-meeting-recorder.utils.d.ts +8 -0
  54. package/dist/impls/fireflies-meeting-recorder.utils.d.ts.map +1 -0
  55. package/dist/impls/fireflies-meeting-recorder.utils.js +36 -0
  56. package/dist/impls/fireflies-meeting-recorder.utils.js.map +1 -0
  57. package/dist/impls/gcs-storage.d.ts.map +1 -1
  58. package/dist/impls/gmail-inbound.d.ts.map +1 -1
  59. package/dist/impls/gmail-outbound.d.ts.map +1 -1
  60. package/dist/impls/google-calendar.d.ts.map +1 -1
  61. package/dist/impls/gradium-voice.d.ts +26 -0
  62. package/dist/impls/gradium-voice.d.ts.map +1 -0
  63. package/dist/impls/gradium-voice.js +80 -0
  64. package/dist/impls/gradium-voice.js.map +1 -0
  65. package/dist/impls/granola-meeting-recorder.d.ts +27 -0
  66. package/dist/impls/granola-meeting-recorder.d.ts.map +1 -0
  67. package/dist/impls/granola-meeting-recorder.js +145 -0
  68. package/dist/impls/granola-meeting-recorder.js.map +1 -0
  69. package/dist/impls/granola-meeting-recorder.types.d.ts +50 -0
  70. package/dist/impls/granola-meeting-recorder.types.d.ts.map +1 -0
  71. package/dist/impls/granola-meeting-recorder.types.js +0 -0
  72. package/dist/impls/index.d.ts +15 -2
  73. package/dist/impls/index.js +18 -5
  74. package/dist/impls/jira.d.ts +25 -0
  75. package/dist/impls/jira.d.ts.map +1 -0
  76. package/dist/impls/jira.js +114 -0
  77. package/dist/impls/jira.js.map +1 -0
  78. package/dist/impls/linear.d.ts +24 -0
  79. package/dist/impls/linear.d.ts.map +1 -0
  80. package/dist/impls/linear.js +75 -0
  81. package/dist/impls/linear.js.map +1 -0
  82. package/dist/impls/mistral-embedding.d.ts.map +1 -1
  83. package/dist/impls/mistral-llm.d.ts.map +1 -1
  84. package/dist/impls/notion.d.ts +27 -0
  85. package/dist/impls/notion.d.ts.map +1 -0
  86. package/dist/impls/notion.js +126 -0
  87. package/dist/impls/notion.js.map +1 -0
  88. package/dist/impls/posthog-reader.d.ts +26 -0
  89. package/dist/impls/posthog-reader.d.ts.map +1 -0
  90. package/dist/impls/posthog-reader.js +141 -0
  91. package/dist/impls/posthog-reader.js.map +1 -0
  92. package/dist/impls/posthog-utils.d.ts +8 -0
  93. package/dist/impls/posthog-utils.d.ts.map +1 -0
  94. package/dist/impls/posthog-utils.js +30 -0
  95. package/dist/impls/posthog-utils.js.map +1 -0
  96. package/dist/impls/posthog.d.ts +40 -0
  97. package/dist/impls/posthog.d.ts.map +1 -0
  98. package/dist/impls/posthog.js +122 -0
  99. package/dist/impls/posthog.js.map +1 -0
  100. package/dist/impls/postmark-email.d.ts.map +1 -1
  101. package/dist/impls/powens-client.d.ts.map +1 -1
  102. package/dist/impls/powens-openbanking.d.ts +1 -1
  103. package/dist/impls/powens-openbanking.d.ts.map +1 -1
  104. package/dist/impls/provider-factory.d.ts +10 -2
  105. package/dist/impls/provider-factory.d.ts.map +1 -1
  106. package/dist/impls/provider-factory.js +143 -2
  107. package/dist/impls/provider-factory.js.map +1 -1
  108. package/dist/impls/qdrant-vector.d.ts.map +1 -1
  109. package/dist/impls/stripe-payments.d.ts.map +1 -1
  110. package/dist/impls/supabase-psql.d.ts +28 -0
  111. package/dist/impls/supabase-psql.d.ts.map +1 -0
  112. package/dist/impls/supabase-psql.js +111 -0
  113. package/dist/impls/supabase-psql.js.map +1 -0
  114. package/dist/impls/supabase-vector.d.ts +36 -0
  115. package/dist/impls/supabase-vector.d.ts.map +1 -0
  116. package/dist/impls/supabase-vector.js +149 -0
  117. package/dist/impls/supabase-vector.js.map +1 -0
  118. package/dist/impls/tldv-meeting-recorder.d.ts +25 -0
  119. package/dist/impls/tldv-meeting-recorder.d.ts.map +1 -0
  120. package/dist/impls/tldv-meeting-recorder.js +131 -0
  121. package/dist/impls/tldv-meeting-recorder.js.map +1 -0
  122. package/dist/impls/twilio-sms.d.ts.map +1 -1
  123. package/dist/index.d.ts +29 -8
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +44 -6
  126. package/dist/index.js.map +1 -1
  127. package/dist/llm.d.ts +1 -0
  128. package/dist/llm.d.ts.map +1 -1
  129. package/dist/llm.js +1 -1
  130. package/dist/meeting-recorder.d.ts +9 -0
  131. package/dist/meeting-recorder.d.ts.map +1 -0
  132. package/dist/meeting-recorder.js +3 -0
  133. package/dist/openbanking.d.ts +1 -0
  134. package/dist/openbanking.d.ts.map +1 -1
  135. package/dist/openbanking.js +1 -1
  136. package/dist/payments.d.ts +1 -0
  137. package/dist/payments.d.ts.map +1 -1
  138. package/dist/payments.js +1 -1
  139. package/dist/project-management.d.ts +9 -0
  140. package/dist/project-management.d.ts.map +1 -0
  141. package/dist/project-management.js +3 -0
  142. package/dist/sms.d.ts +1 -0
  143. package/dist/sms.d.ts.map +1 -1
  144. package/dist/sms.js +1 -1
  145. package/dist/storage.d.ts +1 -0
  146. package/dist/storage.d.ts.map +1 -1
  147. package/dist/storage.js +1 -1
  148. package/dist/vector-store.d.ts +1 -0
  149. package/dist/vector-store.d.ts.map +1 -1
  150. package/dist/vector-store.js +1 -1
  151. package/dist/voice.d.ts +1 -0
  152. package/dist/voice.d.ts.map +1 -1
  153. package/dist/voice.js +1 -1
  154. package/package.json +64 -12
@@ -1 +1 @@
1
- {"version":3,"file":"gmail-inbound.d.ts","names":[],"sources":["../../src/impls/gmail-inbound.ts"],"sourcesContent":[],"mappings":";;;;UAUiB,2BAAA;QACT,QAAA,CAAS;EADA,MAAA,CAAA,EAAA,MAAA;EAOJ,KAAA,CAAA,EAJH,QAAA,CAAS,KAIN;EAMU,gBAAA,CAAA,EAAA,OAAA;;AAYoC,cAlB9C,oBAAA,YAAgC,eAAA,CAAA,oBAkBc,CAAA;EAAR,iBAAA,KAAA;EAqBN,iBAAA,MAAA;EAAR,iBAAA,gBAAA;EAsDJ,iBAAA,IAAA;uBAvFV;EAuFiC,WAAA,CAAA,KAAA,CAAA,EA3E5B,eAAA,CAAA,oBA2E4B,CAAA,EA3EL,OA2EK,CA3EG,eAAA,CAAA,WA2EH,EAAA,CAAA;EA7FX,SAAA,CAAA,QAAA,EAAA,MAAA,CAAA,EAuCR,OAvCQ,CAuCA,eAAA,CAAA,WAvCA,GAAA,IAAA,CAAA;EAAoB,iBAAA,CAAA,KAAA,EA6FhC,eAAA,CAAA,uBA7FgC,CAAA,EA6FT,OA7FS,CAAA"}
1
+ {"version":3,"file":"gmail-inbound.d.ts","names":[],"sources":["../../src/impls/gmail-inbound.ts"],"mappings":";;;;UAUiB,2BAAA;EACf,IAAA,EAAM,QAAA,CAAS,OAAA;EACf,MAAA;EACA,KAAA,GAAQ,QAAA,CAAS,KAAA;EACjB,gBAAA;AAAA;AAAA,cAGW,oBAAA,YAAgC,eAAA,CAAA,oBAAA;EAAA,iBAC1B,KAAA;EAAA,iBACA,MAAA;EAAA,iBACA,gBAAA;EAAA,iBACA,IAAA;cAEL,OAAA,EAAS,2BAAA;EAYf,WAAA,CAAY,KAAA,GAAQ,eAAA,CAAA,oBAAA,GAAuB,OAAA,CAAQ,eAAA,CAAA,WAAA;EAqBnD,SAAA,CAAU,QAAA,WAAmB,OAAA,CAAQ,eAAA,CAAA,WAAA;EAsDrC,iBAAA,CAAkB,KAAA,EAAO,eAAA,CAAA,uBAAA,GAAuB,OAAA;;;;UAwC9C,gBAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"gmail-outbound.d.ts","names":[],"sources":["../../src/impls/gmail-outbound.ts"],"sourcesContent":[],"mappings":";;;;UASiB,4BAAA;QACT,QAAA,CAAS;EADA,MAAA,CAAA,EAAA,MAAA;EAMJ,KAAA,CAAA,EAHH,QAAA,CAAS,KAGN;;AAgBc,cAhBd,qBAAA,YAAiC,eAAA,CAAA,qBAgBnB,CAAA;EAA+B,iBAAA,KAAA;EAAR,iBAAA,MAAA;EAhBJ,iBAAA,IAAA;EAAqB,WAAA,CAAA,OAAA,EAK5C,4BAL4C;qBAgBxC,eAAA,CAAA,uBAAuB,QAAQ,eAAA,CAAA"}
1
+ {"version":3,"file":"gmail-outbound.d.ts","names":[],"sources":["../../src/impls/gmail-outbound.ts"],"mappings":";;;;UASiB,4BAAA;EACf,IAAA,EAAM,QAAA,CAAS,OAAA;EACf,MAAA;EACA,KAAA,GAAQ,QAAA,CAAS,KAAA;AAAA;AAAA,cAGN,qBAAA,YAAiC,eAAA,CAAA,qBAAA;EAAA,iBAC3B,KAAA;EAAA,iBACA,MAAA;EAAA,iBACA,IAAA;cAEL,OAAA,EAAS,4BAAA;EAWf,SAAA,CAAU,OAAA,EAAS,eAAA,CAAA,oBAAA,GAAuB,OAAA,CAAQ,eAAA,CAAA,mBAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"google-calendar.d.ts","names":[],"sources":["../../src/impls/google-calendar.ts"],"sourcesContent":[],"mappings":";;;;UAWiB,6BAAA;QACT,WAAA,CAAY;EADH,QAAA,CAAA,EAEJ,WAAA,CAAY,QAFR;EAMJ,UAAA,CAAA,EAAA,MAAA;;AAiBF,cAjBE,sBAAA,YAAkC,kBAAA,CAAA,gBAiBpC,CAAA;EACE,iBAAA,QAAA;EAAR,iBAAA,iBAAA;EAuBsB,iBAAA,IAAA;EAA6B,WAAA,CAAA,OAAA,EApCjC,6BAoCiC;EAAR,UAAA,CAAA,KAAA,EAxBrC,kBAAA,CAAA,uBAwBqC,CAAA,EAvB3C,OAuB2C,CAvBnC,kBAAA,CAAA,wBAuBmC,CAAA;EAcrC,WAAA,CAAA,KAAA,EAdgB,kBAAA,CAAA,kBAchB,CAAA,EAdqC,OAcrC,CAd6C,kBAAA,CAAA,aAc7C,CAAA;EACE,WAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EADF,kBAAA,CAAA,wBACE,CAAA,EAAR,OAAQ,CAAA,kBAAA,CAAA,aAAA,CAAA;EAAR,WAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,CAAA,EAWqD,OAXrD,CAAA,IAAA,CAAA;EAWqD,QAAA,eAAA;EAnEX,QAAA,aAAA"}
1
+ {"version":3,"file":"google-calendar.d.ts","names":[],"sources":["../../src/impls/google-calendar.ts"],"mappings":";;;;UAWiB,6BAAA;EACf,IAAA,EAAM,WAAA,CAAY,OAAA;EAClB,QAAA,GAAW,WAAA,CAAY,QAAA;EACvB,UAAA;AAAA;AAAA,cAGW,sBAAA,YAAkC,kBAAA,CAAA,gBAAA;EAAA,iBAC5B,QAAA;EAAA,iBACA,iBAAA;EAAA,iBACA,IAAA;cAEL,OAAA,EAAS,6BAAA;EAWf,UAAA,CACJ,KAAA,EAAO,kBAAA,CAAA,uBAAA,GACN,OAAA,CAAQ,kBAAA,CAAA,wBAAA;EAuBL,WAAA,CAAY,KAAA,EAAO,kBAAA,CAAA,kBAAA,GAAqB,OAAA,CAAQ,kBAAA,CAAA,aAAA;EAWhD,WAAA,CACJ,UAAA,UACA,OAAA,UACA,KAAA,EAAO,kBAAA,CAAA,wBAAA,GACN,OAAA,CAAQ,kBAAA,CAAA,aAAA;EAWL,WAAA,CAAY,UAAA,UAAoB,OAAA,WAAkB,OAAA;EAAA,QAQhD,eAAA;EAAA,QAwCA,aAAA;AAAA"}
@@ -0,0 +1,26 @@
1
+ import { voice_d_exports } from "../voice.js";
2
+ import { Gradium, Region, TTSOutputFormat } from "@confiture-ai/gradium-sdk-js";
3
+
4
+ //#region src/impls/gradium-voice.d.ts
5
+ type GradiumClient = Gradium;
6
+ interface GradiumVoiceProviderOptions {
7
+ apiKey: string;
8
+ defaultVoiceId?: string;
9
+ region?: Region;
10
+ baseUrl?: string;
11
+ timeoutMs?: number;
12
+ outputFormat?: TTSOutputFormat;
13
+ client?: GradiumClient;
14
+ }
15
+ declare class GradiumVoiceProvider implements voice_d_exports.VoiceProvider {
16
+ private readonly client;
17
+ private readonly defaultVoiceId?;
18
+ private readonly defaultOutputFormat?;
19
+ constructor(options: GradiumVoiceProviderOptions);
20
+ listVoices(): Promise<voice_d_exports.Voice[]>;
21
+ synthesize(input: voice_d_exports.VoiceSynthesisInput): Promise<voice_d_exports.VoiceSynthesisResult>;
22
+ private fromGradiumVoice;
23
+ }
24
+ //#endregion
25
+ export { GradiumVoiceProvider, GradiumVoiceProviderOptions };
26
+ //# sourceMappingURL=gradium-voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradium-voice.d.ts","names":[],"sources":["../../src/impls/gradium-voice.ts"],"mappings":";;;;KAcK,aAAA,GAAgB,OAAA;AAAA,UAYJ,2BAAA;EACf,MAAA;EACA,cAAA;EACA,MAAA,GAAS,MAAA;EACT,OAAA;EACA,SAAA;EACA,YAAA,GAAe,eAAA;EACf,MAAA,GAAS,aAAA;AAAA;AAAA,cAGE,oBAAA,YAAgC,eAAA,CAAA,aAAA;EAAA,iBAC1B,MAAA;EAAA,iBACA,cAAA;EAAA,iBACA,mBAAA;cAEL,OAAA,EAAS,2BAAA;EAaf,UAAA,CAAA,GAAc,OAAA,CAAQ,eAAA,CAAA,KAAA;EAKtB,UAAA,CAAW,KAAA,EAAO,eAAA,CAAA,mBAAA,GAAsB,OAAA,CAAQ,eAAA,CAAA,oBAAA;EAAA,QA6B9C,gBAAA;AAAA"}
@@ -0,0 +1,80 @@
1
+ import { Gradium } from "@confiture-ai/gradium-sdk-js";
2
+
3
+ //#region src/impls/gradium-voice.ts
4
+ const FORMAT_MAP = {
5
+ mp3: "wav",
6
+ wav: "wav",
7
+ ogg: "opus",
8
+ pcm: "pcm"
9
+ };
10
+ var GradiumVoiceProvider = class {
11
+ client;
12
+ defaultVoiceId;
13
+ defaultOutputFormat;
14
+ constructor(options) {
15
+ this.client = options.client ?? new Gradium({
16
+ apiKey: options.apiKey,
17
+ region: options.region,
18
+ baseURL: options.baseUrl,
19
+ timeout: options.timeoutMs
20
+ });
21
+ this.defaultVoiceId = options.defaultVoiceId;
22
+ this.defaultOutputFormat = options.outputFormat;
23
+ }
24
+ async listVoices() {
25
+ return (await this.client.voices.list({ include_catalog: true })).map((voice) => this.fromGradiumVoice(voice));
26
+ }
27
+ async synthesize(input) {
28
+ const voiceId = input.voiceId ?? this.defaultVoiceId;
29
+ if (!voiceId) throw new Error("Voice ID is required for Gradium synthesis.");
30
+ const outputFormat = (input.format ? FORMAT_MAP[input.format] : void 0) ?? this.defaultOutputFormat ?? "wav";
31
+ const response = await this.client.tts.create({
32
+ voice_id: voiceId,
33
+ output_format: outputFormat,
34
+ text: input.text
35
+ });
36
+ return {
37
+ audio: response.raw_data,
38
+ format: input.format ?? toContractFormat(outputFormat),
39
+ sampleRateHz: input.sampleRateHz ?? response.sample_rate ?? inferSampleRate(outputFormat),
40
+ durationSeconds: void 0,
41
+ url: void 0
42
+ };
43
+ }
44
+ fromGradiumVoice(voice) {
45
+ return {
46
+ id: voice.uid,
47
+ name: voice.name,
48
+ description: voice.description ?? void 0,
49
+ language: voice.language ?? void 0,
50
+ metadata: {
51
+ startSeconds: String(voice.start_s),
52
+ ...voice.stop_s != null ? { stopSeconds: String(voice.stop_s) } : {},
53
+ filename: voice.filename
54
+ }
55
+ };
56
+ }
57
+ };
58
+ function toContractFormat(format) {
59
+ switch (format) {
60
+ case "opus": return "ogg";
61
+ case "wav": return "wav";
62
+ case "pcm":
63
+ case "pcm_16000":
64
+ case "pcm_24000": return "pcm";
65
+ default: return format;
66
+ }
67
+ }
68
+ function inferSampleRate(format) {
69
+ switch (format) {
70
+ case "ulaw_8000":
71
+ case "alaw_8000": return 8e3;
72
+ case "pcm_16000": return 16e3;
73
+ case "pcm_24000": return 24e3;
74
+ default: return 48e3;
75
+ }
76
+ }
77
+
78
+ //#endregion
79
+ export { GradiumVoiceProvider };
80
+ //# sourceMappingURL=gradium-voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradium-voice.js","names":[],"sources":["../../src/impls/gradium-voice.ts"],"sourcesContent":["import { Gradium } from '@confiture-ai/gradium-sdk-js';\nimport type {\n Region,\n TTSOutputFormat,\n Voice as GradiumVoice,\n} from '@confiture-ai/gradium-sdk-js';\n\nimport type {\n Voice,\n VoiceProvider,\n VoiceSynthesisInput,\n VoiceSynthesisResult,\n} from '../voice';\n\ntype GradiumClient = Gradium;\n\nconst FORMAT_MAP: Record<\n NonNullable<VoiceSynthesisInput['format']>,\n TTSOutputFormat\n> = {\n mp3: 'wav',\n wav: 'wav',\n ogg: 'opus',\n pcm: 'pcm',\n};\n\nexport interface GradiumVoiceProviderOptions {\n apiKey: string;\n defaultVoiceId?: string;\n region?: Region;\n baseUrl?: string;\n timeoutMs?: number;\n outputFormat?: TTSOutputFormat;\n client?: GradiumClient;\n}\n\nexport class GradiumVoiceProvider implements VoiceProvider {\n private readonly client: GradiumClient;\n private readonly defaultVoiceId?: string;\n private readonly defaultOutputFormat?: TTSOutputFormat;\n\n constructor(options: GradiumVoiceProviderOptions) {\n this.client =\n options.client ??\n new Gradium({\n apiKey: options.apiKey,\n region: options.region,\n baseURL: options.baseUrl,\n timeout: options.timeoutMs,\n });\n this.defaultVoiceId = options.defaultVoiceId;\n this.defaultOutputFormat = options.outputFormat;\n }\n\n async listVoices(): Promise<Voice[]> {\n const voices = await this.client.voices.list({ include_catalog: true });\n return voices.map((voice) => this.fromGradiumVoice(voice));\n }\n\n async synthesize(input: VoiceSynthesisInput): Promise<VoiceSynthesisResult> {\n const voiceId = input.voiceId ?? this.defaultVoiceId;\n if (!voiceId) {\n throw new Error('Voice ID is required for Gradium synthesis.');\n }\n\n const outputFormat =\n (input.format ? FORMAT_MAP[input.format] : undefined) ??\n this.defaultOutputFormat ??\n 'wav';\n\n const response = await this.client.tts.create({\n voice_id: voiceId,\n output_format: outputFormat,\n text: input.text,\n });\n\n return {\n audio: response.raw_data,\n format: input.format ?? toContractFormat(outputFormat),\n sampleRateHz:\n input.sampleRateHz ??\n response.sample_rate ??\n inferSampleRate(outputFormat),\n durationSeconds: undefined,\n url: undefined,\n };\n }\n\n private fromGradiumVoice(voice: GradiumVoice): Voice {\n return {\n id: voice.uid,\n name: voice.name,\n description: voice.description ?? undefined,\n language: voice.language ?? undefined,\n metadata: {\n startSeconds: String(voice.start_s),\n ...(voice.stop_s != null ? { stopSeconds: String(voice.stop_s) } : {}),\n filename: voice.filename,\n },\n };\n }\n}\n\nfunction toContractFormat(format: TTSOutputFormat): string {\n switch (format) {\n case 'opus':\n return 'ogg';\n case 'wav':\n return 'wav';\n case 'pcm':\n case 'pcm_16000':\n case 'pcm_24000':\n return 'pcm';\n default:\n return format;\n }\n}\n\nfunction inferSampleRate(format: TTSOutputFormat): number {\n switch (format) {\n case 'ulaw_8000':\n case 'alaw_8000':\n return 8000;\n case 'pcm_16000':\n return 16000;\n case 'pcm_24000':\n return 24000;\n default:\n return 48000;\n }\n}\n"],"mappings":";;;AAgBA,MAAM,aAGF;CACF,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACN;AAYD,IAAa,uBAAb,MAA2D;CACzD,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,SAAsC;AAChD,OAAK,SACH,QAAQ,UACR,IAAI,QAAQ;GACV,QAAQ,QAAQ;GAChB,QAAQ,QAAQ;GAChB,SAAS,QAAQ;GACjB,SAAS,QAAQ;GAClB,CAAC;AACJ,OAAK,iBAAiB,QAAQ;AAC9B,OAAK,sBAAsB,QAAQ;;CAGrC,MAAM,aAA+B;AAEnC,UADe,MAAM,KAAK,OAAO,OAAO,KAAK,EAAE,iBAAiB,MAAM,CAAC,EACzD,KAAK,UAAU,KAAK,iBAAiB,MAAM,CAAC;;CAG5D,MAAM,WAAW,OAA2D;EAC1E,MAAM,UAAU,MAAM,WAAW,KAAK;AACtC,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,8CAA8C;EAGhE,MAAM,gBACH,MAAM,SAAS,WAAW,MAAM,UAAU,WAC3C,KAAK,uBACL;EAEF,MAAM,WAAW,MAAM,KAAK,OAAO,IAAI,OAAO;GAC5C,UAAU;GACV,eAAe;GACf,MAAM,MAAM;GACb,CAAC;AAEF,SAAO;GACL,OAAO,SAAS;GAChB,QAAQ,MAAM,UAAU,iBAAiB,aAAa;GACtD,cACE,MAAM,gBACN,SAAS,eACT,gBAAgB,aAAa;GAC/B,iBAAiB;GACjB,KAAK;GACN;;CAGH,AAAQ,iBAAiB,OAA4B;AACnD,SAAO;GACL,IAAI,MAAM;GACV,MAAM,MAAM;GACZ,aAAa,MAAM,eAAe;GAClC,UAAU,MAAM,YAAY;GAC5B,UAAU;IACR,cAAc,OAAO,MAAM,QAAQ;IACnC,GAAI,MAAM,UAAU,OAAO,EAAE,aAAa,OAAO,MAAM,OAAO,EAAE,GAAG,EAAE;IACrE,UAAU,MAAM;IACjB;GACF;;;AAIL,SAAS,iBAAiB,QAAiC;AACzD,SAAQ,QAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,YACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,gBAAgB,QAAiC;AACxD,SAAQ,QAAR;EACE,KAAK;EACL,KAAK,YACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,QACE,QAAO"}
@@ -0,0 +1,27 @@
1
+ import { meeting_recorder_d_exports } from "../meeting-recorder.js";
2
+
3
+ //#region src/impls/granola-meeting-recorder.d.ts
4
+ interface GranolaMeetingRecorderProviderOptions {
5
+ apiKey: string;
6
+ baseUrl?: string;
7
+ pageSize?: number;
8
+ }
9
+ declare class GranolaMeetingRecorderProvider implements meeting_recorder_d_exports.MeetingRecorderProvider {
10
+ private readonly apiKey;
11
+ private readonly baseUrl;
12
+ private readonly defaultPageSize?;
13
+ constructor(options: GranolaMeetingRecorderProviderOptions);
14
+ listMeetings(params: meeting_recorder_d_exports.MeetingRecorderListMeetingsParams): Promise<meeting_recorder_d_exports.MeetingRecorderListMeetingsResult>;
15
+ getMeeting(params: meeting_recorder_d_exports.MeetingRecorderGetMeetingParams): Promise<meeting_recorder_d_exports.MeetingRecord>;
16
+ getTranscript(params: meeting_recorder_d_exports.MeetingRecorderGetTranscriptParams): Promise<meeting_recorder_d_exports.MeetingTranscriptRecord>;
17
+ private getNote;
18
+ private mapNoteSummary;
19
+ private mapNoteDetail;
20
+ private mapTranscriptSegments;
21
+ private mapUser;
22
+ private mapInvitee;
23
+ private request;
24
+ }
25
+ //#endregion
26
+ export { GranolaMeetingRecorderProvider, GranolaMeetingRecorderProviderOptions };
27
+ //# sourceMappingURL=granola-meeting-recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granola-meeting-recorder.d.ts","names":[],"sources":["../../src/impls/granola-meeting-recorder.ts"],"mappings":";;;UAoBiB,qCAAA;EACf,MAAA;EACA,OAAA;EACA,QAAA;AAAA;AAAA,cAMW,8BAAA,YAA0C,0BAAA,CAAA,uBAAA;EAAA,iBACpC,MAAA;EAAA,iBACA,OAAA;EAAA,iBACA,eAAA;cAEL,OAAA,EAAS,qCAAA;EAMf,YAAA,CACJ,MAAA,EAAQ,0BAAA,CAAA,iCAAA,GACP,OAAA,CAAQ,0BAAA,CAAA,iCAAA;EAoBL,UAAA,CACJ,MAAA,EAAQ,0BAAA,CAAA,+BAAA,GACP,OAAA,CAAQ,0BAAA,CAAA,aAAA;EAML,aAAA,CACJ,MAAA,EAAQ,0BAAA,CAAA,kCAAA,GACP,OAAA,CAAQ,0BAAA,CAAA,uBAAA;EAAA,QAoBG,OAAA;EAAA,QAKN,cAAA;EAAA,QAqBA,aAAA;EAAA,QA2CA,qBAAA;EAAA,QAaA,OAAA;EAAA,QASA,UAAA;EAAA,QAOM,OAAA;AAAA"}
@@ -0,0 +1,145 @@
1
+ //#region src/impls/granola-meeting-recorder.ts
2
+ const DEFAULT_BASE_URL = "https://public-api.granola.ai";
3
+ const MAX_PAGE_SIZE = 30;
4
+ var GranolaMeetingRecorderProvider = class {
5
+ apiKey;
6
+ baseUrl;
7
+ defaultPageSize;
8
+ constructor(options) {
9
+ this.apiKey = options.apiKey;
10
+ this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;
11
+ this.defaultPageSize = options.pageSize;
12
+ }
13
+ async listMeetings(params) {
14
+ const query = new URLSearchParams();
15
+ if (params.from) query.set("created_after", params.from);
16
+ if (params.to) query.set("created_before", params.to);
17
+ if (params.cursor) query.set("cursor", params.cursor);
18
+ const pageSize = params.pageSize ?? this.defaultPageSize;
19
+ if (pageSize) query.set("page_size", String(Math.min(pageSize, MAX_PAGE_SIZE)));
20
+ const data = await this.request(`/v1/notes?${query.toString()}`);
21
+ return {
22
+ meetings: data.notes.map((note) => this.mapNoteSummary(note, params)),
23
+ nextCursor: data.cursor ?? void 0,
24
+ hasMore: data.hasMore
25
+ };
26
+ }
27
+ async getMeeting(params) {
28
+ const includeTranscript = params.includeTranscript ?? false;
29
+ const note = await this.getNote(params.meetingId, includeTranscript);
30
+ return this.mapNoteDetail(note, params);
31
+ }
32
+ async getTranscript(params) {
33
+ const note = await this.getNote(params.meetingId, true);
34
+ const segments = this.mapTranscriptSegments(note.transcript);
35
+ return {
36
+ id: note.id,
37
+ meetingId: note.id,
38
+ tenantId: params.tenantId,
39
+ connectionId: params.connectionId ?? "unknown",
40
+ externalId: note.id,
41
+ format: "segments",
42
+ text: segments.map((segment) => segment.text).join("\n"),
43
+ segments,
44
+ generatedAt: note.created_at,
45
+ metadata: { summaryText: note.summary_text },
46
+ raw: note.transcript ?? void 0
47
+ };
48
+ }
49
+ async getNote(noteId, includeTranscript) {
50
+ const query = includeTranscript ? "?include=transcript" : "";
51
+ return this.request(`/v1/notes/${noteId}${query}`);
52
+ }
53
+ mapNoteSummary(note, params) {
54
+ const connectionId = params.connectionId ?? "unknown";
55
+ return {
56
+ id: note.id,
57
+ tenantId: params.tenantId,
58
+ connectionId,
59
+ externalId: note.id,
60
+ title: note.title ?? void 0,
61
+ organizer: this.mapUser(note.owner),
62
+ scheduledStartAt: note.created_at,
63
+ recordingStartAt: note.created_at,
64
+ transcriptAvailable: false,
65
+ createdAt: note.created_at,
66
+ updatedAt: note.created_at,
67
+ sourcePlatform: "granola"
68
+ };
69
+ }
70
+ mapNoteDetail(note, params) {
71
+ const connectionId = params.connectionId ?? "unknown";
72
+ const calendarEvent = note.calendar_event ?? void 0;
73
+ const invitees = calendarEvent?.invitees ? calendarEvent.invitees.map((invitee) => this.mapInvitee(invitee)) : note.attendees?.map((attendee) => this.mapUser(attendee)).filter(Boolean);
74
+ const participants = note.attendees?.map((attendee) => this.mapUser(attendee)).filter(Boolean);
75
+ return {
76
+ id: note.id,
77
+ tenantId: params.tenantId,
78
+ connectionId,
79
+ externalId: note.id,
80
+ title: note.title ?? calendarEvent?.event_title ?? void 0,
81
+ summary: note.summary_text ?? void 0,
82
+ organizer: this.mapUser(note.owner),
83
+ invitees: invitees?.length ? invitees : void 0,
84
+ participants: participants?.length ? participants : void 0,
85
+ scheduledStartAt: calendarEvent?.scheduled_start_time ?? void 0,
86
+ scheduledEndAt: calendarEvent?.scheduled_end_time ?? void 0,
87
+ recordingStartAt: calendarEvent?.scheduled_start_time ?? note.created_at,
88
+ recordingEndAt: calendarEvent?.scheduled_end_time ?? void 0,
89
+ transcriptAvailable: Array.isArray(note.transcript),
90
+ createdAt: note.created_at,
91
+ updatedAt: note.created_at,
92
+ sourcePlatform: "granola",
93
+ metadata: {
94
+ calendarEvent,
95
+ folderMembership: note.folder_membership
96
+ }
97
+ };
98
+ }
99
+ mapTranscriptSegments(transcript) {
100
+ if (!transcript) return [];
101
+ return transcript.map((segment, index) => ({
102
+ index,
103
+ speakerName: segment.speaker?.source ?? void 0,
104
+ text: segment.text,
105
+ startTime: segment.start_time,
106
+ endTime: segment.end_time
107
+ }));
108
+ }
109
+ mapUser(user) {
110
+ if (!user) return void 0;
111
+ return {
112
+ name: user.name ?? void 0,
113
+ email: user.email ?? void 0,
114
+ role: "organizer"
115
+ };
116
+ }
117
+ mapInvitee(invitee) {
118
+ return {
119
+ email: invitee.email,
120
+ role: "attendee"
121
+ };
122
+ }
123
+ async request(path) {
124
+ const response = await fetch(`${this.baseUrl}${path}`, { headers: {
125
+ Authorization: `Bearer ${this.apiKey}`,
126
+ "Content-Type": "application/json"
127
+ } });
128
+ if (!response.ok) {
129
+ const message = await safeReadError(response);
130
+ throw new Error(`Granola API error (${response.status}): ${message}`);
131
+ }
132
+ return await response.json();
133
+ }
134
+ };
135
+ async function safeReadError(response) {
136
+ try {
137
+ return (await response.json())?.message ?? response.statusText;
138
+ } catch {
139
+ return response.statusText;
140
+ }
141
+ }
142
+
143
+ //#endregion
144
+ export { GranolaMeetingRecorderProvider };
145
+ //# sourceMappingURL=granola-meeting-recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granola-meeting-recorder.js","names":[],"sources":["../../src/impls/granola-meeting-recorder.ts"],"sourcesContent":["import type {\n MeetingParticipant,\n MeetingRecord,\n MeetingRecorderGetMeetingParams,\n MeetingRecorderGetTranscriptParams,\n MeetingRecorderListMeetingsParams,\n MeetingRecorderListMeetingsResult,\n MeetingRecorderProvider,\n MeetingTranscriptRecord,\n MeetingTranscriptSegment,\n} from '../meeting-recorder';\nimport type {\n GranolaInvitee,\n GranolaListNotesResponse,\n GranolaNote,\n GranolaNoteSummary,\n GranolaTranscriptSegment,\n GranolaUser,\n} from './granola-meeting-recorder.types';\n\nexport interface GranolaMeetingRecorderProviderOptions {\n apiKey: string;\n baseUrl?: string;\n pageSize?: number;\n}\n\nconst DEFAULT_BASE_URL = 'https://public-api.granola.ai';\nconst MAX_PAGE_SIZE = 30;\n\nexport class GranolaMeetingRecorderProvider implements MeetingRecorderProvider {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly defaultPageSize?: number;\n\n constructor(options: GranolaMeetingRecorderProviderOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.defaultPageSize = options.pageSize;\n }\n\n async listMeetings(\n params: MeetingRecorderListMeetingsParams\n ): Promise<MeetingRecorderListMeetingsResult> {\n const query = new URLSearchParams();\n if (params.from) query.set('created_after', params.from);\n if (params.to) query.set('created_before', params.to);\n if (params.cursor) query.set('cursor', params.cursor);\n const pageSize = params.pageSize ?? this.defaultPageSize;\n if (pageSize) {\n query.set('page_size', String(Math.min(pageSize, MAX_PAGE_SIZE)));\n }\n\n const data = await this.request<GranolaListNotesResponse>(\n `/v1/notes?${query.toString()}`\n );\n return {\n meetings: data.notes.map((note) => this.mapNoteSummary(note, params)),\n nextCursor: data.cursor ?? undefined,\n hasMore: data.hasMore,\n };\n }\n\n async getMeeting(\n params: MeetingRecorderGetMeetingParams\n ): Promise<MeetingRecord> {\n const includeTranscript = params.includeTranscript ?? false;\n const note = await this.getNote(params.meetingId, includeTranscript);\n return this.mapNoteDetail(note, params);\n }\n\n async getTranscript(\n params: MeetingRecorderGetTranscriptParams\n ): Promise<MeetingTranscriptRecord> {\n const note = await this.getNote(params.meetingId, true);\n const segments = this.mapTranscriptSegments(note.transcript);\n return {\n id: note.id,\n meetingId: note.id,\n tenantId: params.tenantId,\n connectionId: params.connectionId ?? 'unknown',\n externalId: note.id,\n format: 'segments',\n text: segments.map((segment) => segment.text).join('\\n'),\n segments,\n generatedAt: note.created_at,\n metadata: {\n summaryText: note.summary_text,\n },\n raw: note.transcript ?? undefined,\n };\n }\n\n private async getNote(noteId: string, includeTranscript: boolean) {\n const query = includeTranscript ? '?include=transcript' : '';\n return this.request<GranolaNote>(`/v1/notes/${noteId}${query}`);\n }\n\n private mapNoteSummary(\n note: GranolaNoteSummary,\n params: MeetingRecorderListMeetingsParams\n ): MeetingRecord {\n const connectionId = params.connectionId ?? 'unknown';\n return {\n id: note.id,\n tenantId: params.tenantId,\n connectionId,\n externalId: note.id,\n title: note.title ?? undefined,\n organizer: this.mapUser(note.owner),\n scheduledStartAt: note.created_at,\n recordingStartAt: note.created_at,\n transcriptAvailable: false,\n createdAt: note.created_at,\n updatedAt: note.created_at,\n sourcePlatform: 'granola',\n };\n }\n\n private mapNoteDetail(\n note: GranolaNote,\n params: MeetingRecorderGetMeetingParams\n ): MeetingRecord {\n const connectionId = params.connectionId ?? 'unknown';\n const calendarEvent = note.calendar_event ?? undefined;\n const invitees = calendarEvent?.invitees\n ? calendarEvent.invitees.map((invitee) => this.mapInvitee(invitee))\n : note.attendees\n ?.map((attendee) => this.mapUser(attendee))\n .filter(Boolean);\n const participants = note.attendees\n ?.map((attendee) => this.mapUser(attendee))\n .filter(Boolean);\n return {\n id: note.id,\n tenantId: params.tenantId,\n connectionId,\n externalId: note.id,\n title: note.title ?? calendarEvent?.event_title ?? undefined,\n summary: note.summary_text ?? undefined,\n organizer: this.mapUser(note.owner),\n invitees: invitees?.length\n ? (invitees as MeetingParticipant[])\n : undefined,\n participants: participants?.length\n ? (participants as MeetingParticipant[])\n : undefined,\n scheduledStartAt: calendarEvent?.scheduled_start_time ?? undefined,\n scheduledEndAt: calendarEvent?.scheduled_end_time ?? undefined,\n recordingStartAt: calendarEvent?.scheduled_start_time ?? note.created_at,\n recordingEndAt: calendarEvent?.scheduled_end_time ?? undefined,\n transcriptAvailable: Array.isArray(note.transcript),\n createdAt: note.created_at,\n updatedAt: note.created_at,\n sourcePlatform: 'granola',\n metadata: {\n calendarEvent,\n folderMembership: note.folder_membership,\n },\n };\n }\n\n private mapTranscriptSegments(\n transcript: GranolaTranscriptSegment[] | null\n ): MeetingTranscriptSegment[] {\n if (!transcript) return [];\n return transcript.map((segment, index) => ({\n index,\n speakerName: segment.speaker?.source ?? undefined,\n text: segment.text,\n startTime: segment.start_time,\n endTime: segment.end_time,\n }));\n }\n\n private mapUser(user?: GranolaUser | null): MeetingParticipant | undefined {\n if (!user) return undefined;\n return {\n name: user.name ?? undefined,\n email: user.email ?? undefined,\n role: 'organizer',\n };\n }\n\n private mapInvitee(invitee: GranolaInvitee): MeetingParticipant {\n return {\n email: invitee.email,\n role: 'attendee',\n };\n }\n\n private async request<T>(path: string): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n });\n if (!response.ok) {\n const message = await safeReadError(response);\n throw new Error(`Granola API error (${response.status}): ${message}`);\n }\n return (await response.json()) as T;\n }\n}\n\nasync function safeReadError(response: Response): Promise<string> {\n try {\n const data = (await response.json()) as { message?: string };\n return data?.message ?? response.statusText;\n } catch {\n return response.statusText;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ //#region src/impls/granola-meeting-recorder.types.d.ts
2
+ interface GranolaListNotesResponse {
3
+ notes: GranolaNoteSummary[];
4
+ hasMore: boolean;
5
+ cursor: string | null;
6
+ }
7
+ interface GranolaNoteSummary {
8
+ id: string;
9
+ title: string | null;
10
+ owner: GranolaUser;
11
+ created_at: string;
12
+ }
13
+ interface GranolaNote extends GranolaNoteSummary {
14
+ calendar_event: GranolaCalendarEvent | null;
15
+ attendees: GranolaUser[];
16
+ folder_membership: GranolaFolder[];
17
+ summary_text: string;
18
+ transcript: GranolaTranscriptSegment[] | null;
19
+ }
20
+ interface GranolaUser {
21
+ name: string | null;
22
+ email: string;
23
+ }
24
+ interface GranolaInvitee {
25
+ email: string;
26
+ }
27
+ interface GranolaCalendarEvent {
28
+ event_title: string | null;
29
+ invitees: GranolaInvitee[];
30
+ organiser: string | null;
31
+ calendar_event_id: string | null;
32
+ scheduled_start_time: string | null;
33
+ scheduled_end_time: string | null;
34
+ }
35
+ interface GranolaFolder {
36
+ id: string;
37
+ object: 'folder';
38
+ name: string;
39
+ }
40
+ interface GranolaTranscriptSegment {
41
+ speaker?: {
42
+ source?: string;
43
+ } | null;
44
+ text: string;
45
+ start_time: string;
46
+ end_time: string;
47
+ }
48
+ //#endregion
49
+ export { GranolaCalendarEvent, GranolaFolder, GranolaInvitee, GranolaListNotesResponse, GranolaNote, GranolaNoteSummary, GranolaTranscriptSegment, GranolaUser };
50
+ //# sourceMappingURL=granola-meeting-recorder.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granola-meeting-recorder.types.d.ts","names":[],"sources":["../../src/impls/granola-meeting-recorder.types.ts"],"mappings":";UAAiB,wBAAA;EACf,KAAA,EAAO,kBAAA;EACP,OAAA;EACA,MAAA;AAAA;AAAA,UAGe,kBAAA;EACf,EAAA;EACA,KAAA;EACA,KAAA,EAAO,WAAA;EACP,UAAA;AAAA;AAAA,UAGe,WAAA,SAAoB,kBAAA;EACnC,cAAA,EAAgB,oBAAA;EAChB,SAAA,EAAW,WAAA;EACX,iBAAA,EAAmB,aAAA;EACnB,YAAA;EACA,UAAA,EAAY,wBAAA;AAAA;AAAA,UAGG,WAAA;EACf,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;AAAA;AAAA,UAGe,oBAAA;EACf,WAAA;EACA,QAAA,EAAU,cAAA;EACV,SAAA;EACA,iBAAA;EACA,oBAAA;EACA,kBAAA;AAAA;AAAA,UAGe,aAAA;EACf,EAAA;EACA,MAAA;EACA,IAAA;AAAA;AAAA,UAGe,wBAAA;EACf,OAAA;IAAY,MAAA;EAAA;EACZ,IAAA;EACA,UAAA;EACA,QAAA;AAAA"}
File without changes
@@ -1,15 +1,28 @@
1
1
  import { ElevenLabsVoiceProvider, ElevenLabsVoiceProviderOptions } from "./elevenlabs-voice.js";
2
+ import { FalVoiceProvider, FalVoiceProviderOptions } from "./fal-voice.js";
3
+ import { FathomMeetingRecorderProvider, FathomMeetingRecorderProviderOptions } from "./fathom-meeting-recorder.js";
4
+ import { FirefliesMeetingRecorderProvider, FirefliesMeetingRecorderProviderOptions } from "./fireflies-meeting-recorder.js";
2
5
  import { GoogleCloudStorageProvider, GoogleCloudStorageProviderOptions } from "./gcs-storage.js";
3
6
  import { GmailInboundProvider, GmailInboundProviderOptions } from "./gmail-inbound.js";
4
7
  import { GmailOutboundProvider, GmailOutboundProviderOptions } from "./gmail-outbound.js";
5
8
  import { GoogleCalendarProvider, GoogleCalendarProviderOptions } from "./google-calendar.js";
6
- import { IntegrationProviderFactory } from "./provider-factory.js";
9
+ import { GradiumVoiceProvider, GradiumVoiceProviderOptions } from "./gradium-voice.js";
10
+ import { GranolaMeetingRecorderProvider, GranolaMeetingRecorderProviderOptions } from "./granola-meeting-recorder.js";
7
11
  import { MistralLLMProvider, MistralLLMProviderOptions } from "./mistral-llm.js";
8
12
  import { MistralEmbeddingProvider, MistralEmbeddingProviderOptions } from "./mistral-embedding.js";
9
13
  import { QdrantVectorProvider, QdrantVectorProviderOptions } from "./qdrant-vector.js";
14
+ import { SupabasePostgresProvider, SupabasePostgresProviderOptions, SupabasePostgresSslMode } from "./supabase-psql.js";
15
+ import { SupabaseVectorDistanceMetric, SupabaseVectorProvider, SupabaseVectorProviderOptions } from "./supabase-vector.js";
10
16
  import { StripePaymentsProvider, StripePaymentsProviderOptions } from "./stripe-payments.js";
11
17
  import { PostmarkEmailProvider, PostmarkEmailProviderOptions } from "./postmark-email.js";
18
+ import { PosthogAnalyticsProvider, PosthogAnalyticsProviderOptions } from "./posthog.js";
19
+ import { PosthogAnalyticsReader, PosthogAnalyticsReaderOptions, PosthogReaderClient } from "./posthog-reader.js";
12
20
  import { TwilioSmsProvider, TwilioSmsProviderOptions } from "./twilio-sms.js";
13
21
  import { PowensAccount, PowensAccountListResponse, PowensBalance, PowensClient, PowensClientError, PowensClientOptions, PowensConnectionStatusResponse, PowensEnvironment, PowensTransaction, PowensTransactionListResponse } from "./powens-client.js";
14
22
  import { PowensOpenBankingProvider, PowensOpenBankingProviderOptions } from "./powens-openbanking.js";
15
- export { ElevenLabsVoiceProvider, ElevenLabsVoiceProviderOptions, GmailInboundProvider, GmailInboundProviderOptions, GmailOutboundProvider, GmailOutboundProviderOptions, GoogleCalendarProvider, GoogleCalendarProviderOptions, GoogleCloudStorageProvider, GoogleCloudStorageProviderOptions, IntegrationProviderFactory, MistralEmbeddingProvider, MistralEmbeddingProviderOptions, MistralLLMProvider, MistralLLMProviderOptions, PostmarkEmailProvider, PostmarkEmailProviderOptions, PowensAccount, PowensAccountListResponse, PowensBalance, PowensClient, PowensClientError, PowensClientOptions, PowensConnectionStatusResponse, PowensEnvironment, PowensOpenBankingProvider, PowensOpenBankingProviderOptions, PowensTransaction, PowensTransactionListResponse, QdrantVectorProvider, QdrantVectorProviderOptions, StripePaymentsProvider, StripePaymentsProviderOptions, TwilioSmsProvider, TwilioSmsProviderOptions };
23
+ import { LinearProjectManagementProvider, LinearProjectManagementProviderOptions } from "./linear.js";
24
+ import { JiraProjectManagementProvider, JiraProjectManagementProviderOptions } from "./jira.js";
25
+ import { NotionProjectManagementProvider, NotionProjectManagementProviderOptions } from "./notion.js";
26
+ import { TldvMeetingRecorderProvider, TldvMeetingRecorderProviderOptions } from "./tldv-meeting-recorder.js";
27
+ import { IntegrationProviderFactory } from "./provider-factory.js";
28
+ export { ElevenLabsVoiceProvider, ElevenLabsVoiceProviderOptions, FalVoiceProvider, FalVoiceProviderOptions, FathomMeetingRecorderProvider, FathomMeetingRecorderProviderOptions, FirefliesMeetingRecorderProvider, FirefliesMeetingRecorderProviderOptions, GmailInboundProvider, GmailInboundProviderOptions, GmailOutboundProvider, GmailOutboundProviderOptions, GoogleCalendarProvider, GoogleCalendarProviderOptions, GoogleCloudStorageProvider, GoogleCloudStorageProviderOptions, GradiumVoiceProvider, GradiumVoiceProviderOptions, GranolaMeetingRecorderProvider, GranolaMeetingRecorderProviderOptions, IntegrationProviderFactory, JiraProjectManagementProvider, JiraProjectManagementProviderOptions, LinearProjectManagementProvider, LinearProjectManagementProviderOptions, MistralEmbeddingProvider, MistralEmbeddingProviderOptions, MistralLLMProvider, MistralLLMProviderOptions, NotionProjectManagementProvider, NotionProjectManagementProviderOptions, PosthogAnalyticsProvider, PosthogAnalyticsProviderOptions, PosthogAnalyticsReader, PosthogAnalyticsReaderOptions, PosthogReaderClient, PostmarkEmailProvider, PostmarkEmailProviderOptions, PowensAccount, PowensAccountListResponse, PowensBalance, PowensClient, PowensClientError, PowensClientOptions, PowensConnectionStatusResponse, PowensEnvironment, PowensOpenBankingProvider, PowensOpenBankingProviderOptions, PowensTransaction, PowensTransactionListResponse, QdrantVectorProvider, QdrantVectorProviderOptions, StripePaymentsProvider, StripePaymentsProviderOptions, SupabasePostgresProvider, SupabasePostgresProviderOptions, SupabasePostgresSslMode, SupabaseVectorDistanceMetric, SupabaseVectorProvider, SupabaseVectorProviderOptions, TldvMeetingRecorderProvider, TldvMeetingRecorderProviderOptions, TwilioSmsProvider, TwilioSmsProviderOptions };
@@ -1,16 +1,29 @@
1
1
  import { MistralLLMProvider } from "./mistral-llm.js";
2
2
  import { MistralEmbeddingProvider } from "./mistral-embedding.js";
3
3
  import { QdrantVectorProvider } from "./qdrant-vector.js";
4
+ import { SupabasePostgresProvider } from "./supabase-psql.js";
5
+ import { SupabaseVectorProvider } from "./supabase-vector.js";
6
+ import { GmailInboundProvider } from "./gmail-inbound.js";
7
+ import { GmailOutboundProvider } from "./gmail-outbound.js";
8
+ import { GoogleCalendarProvider } from "./google-calendar.js";
9
+ import { ElevenLabsVoiceProvider } from "./elevenlabs-voice.js";
10
+ import { GradiumVoiceProvider } from "./gradium-voice.js";
11
+ import { FalVoiceProvider } from "./fal-voice.js";
4
12
  import { GoogleCloudStorageProvider } from "./gcs-storage.js";
5
13
  import { StripePaymentsProvider } from "./stripe-payments.js";
6
14
  import { PostmarkEmailProvider } from "./postmark-email.js";
15
+ import { PosthogAnalyticsReader } from "./posthog-reader.js";
16
+ import { PosthogAnalyticsProvider } from "./posthog.js";
7
17
  import { TwilioSmsProvider } from "./twilio-sms.js";
8
- import { ElevenLabsVoiceProvider } from "./elevenlabs-voice.js";
9
18
  import { PowensClient, PowensClientError } from "./powens-client.js";
10
19
  import { PowensOpenBankingProvider } from "./powens-openbanking.js";
20
+ import { LinearProjectManagementProvider } from "./linear.js";
21
+ import { JiraProjectManagementProvider } from "./jira.js";
22
+ import { NotionProjectManagementProvider } from "./notion.js";
23
+ import { GranolaMeetingRecorderProvider } from "./granola-meeting-recorder.js";
24
+ import { TldvMeetingRecorderProvider } from "./tldv-meeting-recorder.js";
25
+ import { FirefliesMeetingRecorderProvider } from "./fireflies-meeting-recorder.js";
26
+ import { FathomMeetingRecorderProvider } from "./fathom-meeting-recorder.js";
11
27
  import { IntegrationProviderFactory } from "./provider-factory.js";
12
- import { GmailInboundProvider } from "./gmail-inbound.js";
13
- import { GmailOutboundProvider } from "./gmail-outbound.js";
14
- import { GoogleCalendarProvider } from "./google-calendar.js";
15
28
 
16
- export { ElevenLabsVoiceProvider, GmailInboundProvider, GmailOutboundProvider, GoogleCalendarProvider, GoogleCloudStorageProvider, IntegrationProviderFactory, MistralEmbeddingProvider, MistralLLMProvider, PostmarkEmailProvider, PowensClient, PowensClientError, PowensOpenBankingProvider, QdrantVectorProvider, StripePaymentsProvider, TwilioSmsProvider };
29
+ export { ElevenLabsVoiceProvider, FalVoiceProvider, FathomMeetingRecorderProvider, FirefliesMeetingRecorderProvider, GmailInboundProvider, GmailOutboundProvider, GoogleCalendarProvider, GoogleCloudStorageProvider, GradiumVoiceProvider, GranolaMeetingRecorderProvider, IntegrationProviderFactory, JiraProjectManagementProvider, LinearProjectManagementProvider, MistralEmbeddingProvider, MistralLLMProvider, NotionProjectManagementProvider, PosthogAnalyticsProvider, PosthogAnalyticsReader, PostmarkEmailProvider, PowensClient, PowensClientError, PowensOpenBankingProvider, QdrantVectorProvider, StripePaymentsProvider, SupabasePostgresProvider, SupabaseVectorProvider, TldvMeetingRecorderProvider, TwilioSmsProvider };
@@ -0,0 +1,25 @@
1
+ import { project_management_d_exports } from "../project-management.js";
2
+
3
+ //#region src/impls/jira.d.ts
4
+ interface JiraProjectManagementProviderOptions {
5
+ siteUrl: string;
6
+ email: string;
7
+ apiToken: string;
8
+ projectKey?: string;
9
+ issueType?: string;
10
+ defaultLabels?: string[];
11
+ issueTypeMap?: Partial<Record<project_management_d_exports.ProjectManagementWorkItemType, string>>;
12
+ fetch?: typeof fetch;
13
+ }
14
+ declare class JiraProjectManagementProvider implements project_management_d_exports.ProjectManagementProvider {
15
+ private readonly siteUrl;
16
+ private readonly authHeader;
17
+ private readonly defaults;
18
+ private readonly fetchFn;
19
+ constructor(options: JiraProjectManagementProviderOptions);
20
+ createWorkItem(input: project_management_d_exports.ProjectManagementWorkItemInput): Promise<project_management_d_exports.ProjectManagementWorkItem>;
21
+ createWorkItems(items: project_management_d_exports.ProjectManagementWorkItemInput[]): Promise<project_management_d_exports.ProjectManagementWorkItem[]>;
22
+ }
23
+ //#endregion
24
+ export { JiraProjectManagementProvider, JiraProjectManagementProviderOptions };
25
+ //# sourceMappingURL=jira.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.d.ts","names":[],"sources":["../../src/impls/jira.ts"],"mappings":";;;UASiB,oCAAA;EACf,OAAA;EACA,KAAA;EACA,QAAA;EACA,UAAA;EACA,SAAA;EACA,aAAA;EACA,YAAA,GAAe,OAAA,CAAQ,MAAA,CAAO,4BAAA,CAAA,6BAAA;EAC9B,KAAA,UAAe,KAAA;AAAA;AAAA,cAGJ,6BAAA,YAAyC,4BAAA,CAAA,yBAAA;EAAA,iBACnC,OAAA;EAAA,iBACA,UAAA;EAAA,iBACA,QAAA;EAAA,iBAIA,OAAA;cAEL,OAAA,EAAS,oCAAA;EAYf,cAAA,CACJ,KAAA,EAAO,4BAAA,CAAA,8BAAA,GACN,OAAA,CAAQ,4BAAA,CAAA,yBAAA;EAgEL,eAAA,CACJ,KAAA,EAAO,4BAAA,CAAA,8BAAA,KACN,OAAA,CAAQ,4BAAA,CAAA,yBAAA;AAAA"}
@@ -0,0 +1,114 @@
1
+ import { Buffer } from "node:buffer";
2
+
3
+ //#region src/impls/jira.ts
4
+ var JiraProjectManagementProvider = class {
5
+ siteUrl;
6
+ authHeader;
7
+ defaults;
8
+ fetchFn;
9
+ constructor(options) {
10
+ this.siteUrl = normalizeSiteUrl(options.siteUrl);
11
+ this.authHeader = buildAuthHeader(options.email, options.apiToken);
12
+ this.defaults = {
13
+ projectKey: options.projectKey,
14
+ issueType: options.issueType,
15
+ defaultLabels: options.defaultLabels,
16
+ issueTypeMap: options.issueTypeMap
17
+ };
18
+ this.fetchFn = options.fetch ?? fetch;
19
+ }
20
+ async createWorkItem(input) {
21
+ const projectKey = input.projectId ?? this.defaults.projectKey;
22
+ if (!projectKey) throw new Error("Jira projectKey is required to create work items.");
23
+ const issueType = resolveIssueType(input.type, this.defaults);
24
+ const description = buildJiraDescription(input.description);
25
+ const labels = mergeLabels(this.defaults.defaultLabels, input.tags);
26
+ const priority = mapPriority(input.priority);
27
+ const payload = { fields: {
28
+ project: { key: projectKey },
29
+ summary: input.title,
30
+ description,
31
+ issuetype: { name: issueType },
32
+ labels,
33
+ priority: priority ? { name: priority } : void 0,
34
+ assignee: input.assigneeId ? { accountId: input.assigneeId } : void 0,
35
+ duedate: input.dueDate ? input.dueDate.toISOString().slice(0, 10) : void 0
36
+ } };
37
+ const response = await this.fetchFn(`${this.siteUrl}/rest/api/3/issue`, {
38
+ method: "POST",
39
+ headers: {
40
+ Authorization: this.authHeader,
41
+ "Content-Type": "application/json",
42
+ Accept: "application/json"
43
+ },
44
+ body: JSON.stringify(payload)
45
+ });
46
+ if (!response.ok) {
47
+ const body = await response.text();
48
+ throw new Error(`Jira API error (${response.status}): ${body || response.statusText}`);
49
+ }
50
+ const data = await response.json();
51
+ return {
52
+ id: data.id ?? data.key ?? "",
53
+ title: input.title,
54
+ url: data.key ? `${this.siteUrl}/browse/${data.key}` : void 0,
55
+ status: input.status,
56
+ priority: input.priority,
57
+ tags: input.tags,
58
+ projectId: projectKey,
59
+ externalId: input.externalId,
60
+ metadata: input.metadata
61
+ };
62
+ }
63
+ async createWorkItems(items) {
64
+ const created = [];
65
+ for (const item of items) created.push(await this.createWorkItem(item));
66
+ return created;
67
+ }
68
+ };
69
+ function normalizeSiteUrl(siteUrl) {
70
+ return siteUrl.replace(/\/$/, "");
71
+ }
72
+ function buildAuthHeader(email, apiToken) {
73
+ return `Basic ${Buffer.from(`${email}:${apiToken}`).toString("base64")}`;
74
+ }
75
+ function resolveIssueType(type, defaults) {
76
+ if (type && defaults.issueTypeMap?.[type]) return defaults.issueTypeMap[type] ?? defaults.issueType ?? "Task";
77
+ return defaults.issueType ?? "Task";
78
+ }
79
+ function mapPriority(priority) {
80
+ switch (priority) {
81
+ case "urgent": return "Highest";
82
+ case "high": return "High";
83
+ case "medium": return "Medium";
84
+ case "low": return "Low";
85
+ default: return;
86
+ }
87
+ }
88
+ function mergeLabels(defaults, tags) {
89
+ const merged = /* @__PURE__ */ new Set();
90
+ (defaults ?? []).forEach((label) => merged.add(label));
91
+ (tags ?? []).forEach((tag) => merged.add(tag));
92
+ const result = [...merged];
93
+ return result.length > 0 ? result : void 0;
94
+ }
95
+ function buildJiraDescription(description) {
96
+ if (!description) return void 0;
97
+ const content = description.split(/\r?\n/).filter((line) => line.trim()).map((line) => ({
98
+ type: "paragraph",
99
+ content: [{
100
+ type: "text",
101
+ text: line
102
+ }]
103
+ }));
104
+ if (content.length === 0) return void 0;
105
+ return {
106
+ type: "doc",
107
+ version: 1,
108
+ content
109
+ };
110
+ }
111
+
112
+ //#endregion
113
+ export { JiraProjectManagementProvider };
114
+ //# sourceMappingURL=jira.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira.js","names":[],"sources":["../../src/impls/jira.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport type {\n ProjectManagementProvider,\n ProjectManagementWorkItem,\n ProjectManagementWorkItemInput,\n ProjectManagementWorkItemPriority,\n ProjectManagementWorkItemType,\n} from '../project-management';\n\nexport interface JiraProjectManagementProviderOptions {\n siteUrl: string;\n email: string;\n apiToken: string;\n projectKey?: string;\n issueType?: string;\n defaultLabels?: string[];\n issueTypeMap?: Partial<Record<ProjectManagementWorkItemType, string>>;\n fetch?: typeof fetch;\n}\n\nexport class JiraProjectManagementProvider implements ProjectManagementProvider {\n private readonly siteUrl: string;\n private readonly authHeader: string;\n private readonly defaults: Omit<\n JiraProjectManagementProviderOptions,\n 'siteUrl' | 'email' | 'apiToken' | 'fetch'\n >;\n private readonly fetchFn: typeof fetch;\n\n constructor(options: JiraProjectManagementProviderOptions) {\n this.siteUrl = normalizeSiteUrl(options.siteUrl);\n this.authHeader = buildAuthHeader(options.email, options.apiToken);\n this.defaults = {\n projectKey: options.projectKey,\n issueType: options.issueType,\n defaultLabels: options.defaultLabels,\n issueTypeMap: options.issueTypeMap,\n };\n this.fetchFn = options.fetch ?? fetch;\n }\n\n async createWorkItem(\n input: ProjectManagementWorkItemInput\n ): Promise<ProjectManagementWorkItem> {\n const projectKey = input.projectId ?? this.defaults.projectKey;\n if (!projectKey) {\n throw new Error('Jira projectKey is required to create work items.');\n }\n\n const issueType = resolveIssueType(input.type, this.defaults);\n const description = buildJiraDescription(input.description);\n const labels = mergeLabels(this.defaults.defaultLabels, input.tags);\n const priority = mapPriority(input.priority);\n\n const payload = {\n fields: {\n project: { key: projectKey },\n summary: input.title,\n description,\n issuetype: { name: issueType },\n labels,\n priority: priority ? { name: priority } : undefined,\n assignee: input.assigneeId\n ? { accountId: input.assigneeId }\n : undefined,\n duedate: input.dueDate\n ? input.dueDate.toISOString().slice(0, 10)\n : undefined,\n },\n };\n\n const response = await this.fetchFn(`${this.siteUrl}/rest/api/3/issue`, {\n method: 'POST',\n headers: {\n Authorization: this.authHeader,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Jira API error (${response.status}): ${body || response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n id?: string;\n key?: string;\n self?: string;\n };\n\n return {\n id: data.id ?? data.key ?? '',\n title: input.title,\n url: data.key ? `${this.siteUrl}/browse/${data.key}` : undefined,\n status: input.status,\n priority: input.priority,\n tags: input.tags,\n projectId: projectKey,\n externalId: input.externalId,\n metadata: input.metadata,\n };\n }\n\n async createWorkItems(\n items: ProjectManagementWorkItemInput[]\n ): Promise<ProjectManagementWorkItem[]> {\n const created: ProjectManagementWorkItem[] = [];\n for (const item of items) {\n created.push(await this.createWorkItem(item));\n }\n return created;\n }\n}\n\nfunction normalizeSiteUrl(siteUrl: string): string {\n return siteUrl.replace(/\\/$/, '');\n}\n\nfunction buildAuthHeader(email: string, apiToken: string): string {\n const token = Buffer.from(`${email}:${apiToken}`).toString('base64');\n return `Basic ${token}`;\n}\n\nfunction resolveIssueType(\n type: ProjectManagementWorkItemType | undefined,\n defaults: Pick<\n JiraProjectManagementProviderOptions,\n 'issueType' | 'issueTypeMap'\n >\n): string {\n if (type && defaults.issueTypeMap?.[type]) {\n return defaults.issueTypeMap[type] ?? defaults.issueType ?? 'Task';\n }\n return defaults.issueType ?? 'Task';\n}\n\nfunction mapPriority(\n priority?: ProjectManagementWorkItemPriority\n): string | undefined {\n switch (priority) {\n case 'urgent':\n return 'Highest';\n case 'high':\n return 'High';\n case 'medium':\n return 'Medium';\n case 'low':\n return 'Low';\n case 'none':\n default:\n return undefined;\n }\n}\n\nfunction mergeLabels(\n defaults?: string[],\n tags?: string[]\n): string[] | undefined {\n const merged = new Set<string>();\n (defaults ?? []).forEach((label) => merged.add(label));\n (tags ?? []).forEach((tag) => merged.add(tag));\n const result = [...merged];\n return result.length > 0 ? result : undefined;\n}\n\ninterface JiraDoc {\n type: 'doc';\n version: 1;\n content: JiraDocNode[];\n}\n\ninterface JiraDocNode {\n type: 'paragraph';\n content: JiraDocText[];\n}\n\ninterface JiraDocText {\n type: 'text';\n text: string;\n}\n\nfunction buildJiraDescription(description?: string): JiraDoc | undefined {\n if (!description) return undefined;\n const lines = description.split(/\\r?\\n/).filter((line) => line.trim());\n const content = lines.map((line) => ({\n type: 'paragraph' as const,\n content: [{ type: 'text' as const, text: line }],\n }));\n if (content.length === 0) return undefined;\n return { type: 'doc', version: 1, content };\n}\n"],"mappings":"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"}