@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.
- package/README.md +115 -1
- package/dist/_virtual/{rolldown_runtime.js → _rolldown/runtime.js} +3 -3
- package/dist/analytics.d.ts +9 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +3 -0
- package/dist/calendar.d.ts +1 -0
- package/dist/calendar.d.ts.map +1 -1
- package/dist/calendar.js +1 -1
- package/dist/database.d.ts +9 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +3 -0
- package/dist/email.d.ts +1 -0
- package/dist/email.d.ts.map +1 -1
- package/dist/email.js +1 -1
- package/dist/embedding.d.ts +1 -0
- package/dist/embedding.d.ts.map +1 -1
- package/dist/embedding.js +1 -1
- package/dist/impls/elevenlabs-voice.d.ts.map +1 -1
- package/dist/impls/fal-voice.d.ts +29 -0
- package/dist/impls/fal-voice.d.ts.map +1 -0
- package/dist/impls/fal-voice.js +88 -0
- package/dist/impls/fal-voice.js.map +1 -0
- package/dist/impls/fathom-meeting-recorder.d.ts +42 -0
- package/dist/impls/fathom-meeting-recorder.d.ts.map +1 -0
- package/dist/impls/fathom-meeting-recorder.js +145 -0
- package/dist/impls/fathom-meeting-recorder.js.map +1 -0
- package/dist/impls/fathom-meeting-recorder.mapper.d.ts +9 -0
- package/dist/impls/fathom-meeting-recorder.mapper.d.ts.map +1 -0
- package/dist/impls/fathom-meeting-recorder.mapper.js +42 -0
- package/dist/impls/fathom-meeting-recorder.mapper.js.map +1 -0
- package/dist/impls/fathom-meeting-recorder.types.d.ts +24 -0
- package/dist/impls/fathom-meeting-recorder.types.d.ts.map +1 -0
- package/dist/impls/fathom-meeting-recorder.types.js +0 -0
- package/dist/impls/fathom-meeting-recorder.utils.d.ts +15 -0
- package/dist/impls/fathom-meeting-recorder.utils.d.ts.map +1 -0
- package/dist/impls/fathom-meeting-recorder.utils.js +56 -0
- package/dist/impls/fathom-meeting-recorder.utils.js.map +1 -0
- package/dist/impls/fathom-meeting-recorder.webhooks.d.ts +8 -0
- package/dist/impls/fathom-meeting-recorder.webhooks.d.ts.map +1 -0
- package/dist/impls/fathom-meeting-recorder.webhooks.js +25 -0
- package/dist/impls/fathom-meeting-recorder.webhooks.js.map +1 -0
- package/dist/impls/fireflies-meeting-recorder.d.ts +28 -0
- package/dist/impls/fireflies-meeting-recorder.d.ts.map +1 -0
- package/dist/impls/fireflies-meeting-recorder.js +152 -0
- package/dist/impls/fireflies-meeting-recorder.js.map +1 -0
- package/dist/impls/fireflies-meeting-recorder.queries.d.ts +7 -0
- package/dist/impls/fireflies-meeting-recorder.queries.d.ts.map +1 -0
- package/dist/impls/fireflies-meeting-recorder.queries.js +84 -0
- package/dist/impls/fireflies-meeting-recorder.queries.js.map +1 -0
- package/dist/impls/fireflies-meeting-recorder.types.d.ts +35 -0
- package/dist/impls/fireflies-meeting-recorder.types.d.ts.map +1 -0
- package/dist/impls/fireflies-meeting-recorder.types.js +0 -0
- package/dist/impls/fireflies-meeting-recorder.utils.d.ts +8 -0
- package/dist/impls/fireflies-meeting-recorder.utils.d.ts.map +1 -0
- package/dist/impls/fireflies-meeting-recorder.utils.js +36 -0
- package/dist/impls/fireflies-meeting-recorder.utils.js.map +1 -0
- package/dist/impls/gcs-storage.d.ts.map +1 -1
- package/dist/impls/gmail-inbound.d.ts.map +1 -1
- package/dist/impls/gmail-outbound.d.ts.map +1 -1
- package/dist/impls/google-calendar.d.ts.map +1 -1
- package/dist/impls/gradium-voice.d.ts +26 -0
- package/dist/impls/gradium-voice.d.ts.map +1 -0
- package/dist/impls/gradium-voice.js +80 -0
- package/dist/impls/gradium-voice.js.map +1 -0
- package/dist/impls/granola-meeting-recorder.d.ts +27 -0
- package/dist/impls/granola-meeting-recorder.d.ts.map +1 -0
- package/dist/impls/granola-meeting-recorder.js +145 -0
- package/dist/impls/granola-meeting-recorder.js.map +1 -0
- package/dist/impls/granola-meeting-recorder.types.d.ts +50 -0
- package/dist/impls/granola-meeting-recorder.types.d.ts.map +1 -0
- package/dist/impls/granola-meeting-recorder.types.js +0 -0
- package/dist/impls/index.d.ts +15 -2
- package/dist/impls/index.js +18 -5
- package/dist/impls/jira.d.ts +25 -0
- package/dist/impls/jira.d.ts.map +1 -0
- package/dist/impls/jira.js +114 -0
- package/dist/impls/jira.js.map +1 -0
- package/dist/impls/linear.d.ts +24 -0
- package/dist/impls/linear.d.ts.map +1 -0
- package/dist/impls/linear.js +75 -0
- package/dist/impls/linear.js.map +1 -0
- package/dist/impls/mistral-embedding.d.ts.map +1 -1
- package/dist/impls/mistral-llm.d.ts.map +1 -1
- package/dist/impls/notion.d.ts +27 -0
- package/dist/impls/notion.d.ts.map +1 -0
- package/dist/impls/notion.js +126 -0
- package/dist/impls/notion.js.map +1 -0
- package/dist/impls/posthog-reader.d.ts +26 -0
- package/dist/impls/posthog-reader.d.ts.map +1 -0
- package/dist/impls/posthog-reader.js +141 -0
- package/dist/impls/posthog-reader.js.map +1 -0
- package/dist/impls/posthog-utils.d.ts +8 -0
- package/dist/impls/posthog-utils.d.ts.map +1 -0
- package/dist/impls/posthog-utils.js +30 -0
- package/dist/impls/posthog-utils.js.map +1 -0
- package/dist/impls/posthog.d.ts +40 -0
- package/dist/impls/posthog.d.ts.map +1 -0
- package/dist/impls/posthog.js +122 -0
- package/dist/impls/posthog.js.map +1 -0
- package/dist/impls/postmark-email.d.ts.map +1 -1
- package/dist/impls/powens-client.d.ts.map +1 -1
- package/dist/impls/powens-openbanking.d.ts +1 -1
- package/dist/impls/powens-openbanking.d.ts.map +1 -1
- package/dist/impls/provider-factory.d.ts +10 -2
- package/dist/impls/provider-factory.d.ts.map +1 -1
- package/dist/impls/provider-factory.js +143 -2
- package/dist/impls/provider-factory.js.map +1 -1
- package/dist/impls/qdrant-vector.d.ts.map +1 -1
- package/dist/impls/stripe-payments.d.ts.map +1 -1
- package/dist/impls/supabase-psql.d.ts +28 -0
- package/dist/impls/supabase-psql.d.ts.map +1 -0
- package/dist/impls/supabase-psql.js +111 -0
- package/dist/impls/supabase-psql.js.map +1 -0
- package/dist/impls/supabase-vector.d.ts +36 -0
- package/dist/impls/supabase-vector.d.ts.map +1 -0
- package/dist/impls/supabase-vector.js +149 -0
- package/dist/impls/supabase-vector.js.map +1 -0
- package/dist/impls/tldv-meeting-recorder.d.ts +25 -0
- package/dist/impls/tldv-meeting-recorder.d.ts.map +1 -0
- package/dist/impls/tldv-meeting-recorder.js +131 -0
- package/dist/impls/tldv-meeting-recorder.js.map +1 -0
- package/dist/impls/twilio-sms.d.ts.map +1 -1
- package/dist/index.d.ts +29 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -6
- package/dist/index.js.map +1 -1
- package/dist/llm.d.ts +1 -0
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +1 -1
- package/dist/meeting-recorder.d.ts +9 -0
- package/dist/meeting-recorder.d.ts.map +1 -0
- package/dist/meeting-recorder.js +3 -0
- package/dist/openbanking.d.ts +1 -0
- package/dist/openbanking.d.ts.map +1 -1
- package/dist/openbanking.js +1 -1
- package/dist/payments.d.ts +1 -0
- package/dist/payments.d.ts.map +1 -1
- package/dist/payments.js +1 -1
- package/dist/project-management.d.ts +9 -0
- package/dist/project-management.d.ts.map +1 -0
- package/dist/project-management.js +3 -0
- package/dist/sms.d.ts +1 -0
- package/dist/sms.d.ts.map +1 -1
- package/dist/sms.js +1 -1
- package/dist/storage.d.ts +1 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/vector-store.d.ts +1 -0
- package/dist/vector-store.d.ts.map +1 -1
- package/dist/vector-store.js +1 -1
- package/dist/voice.d.ts +1 -0
- package/dist/voice.d.ts.map +1 -1
- package/dist/voice.js +1 -1
- package/package.json +64 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gmail-inbound.d.ts","names":[],"sources":["../../src/impls/gmail-inbound.ts"],"
|
|
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"],"
|
|
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"],"
|
|
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
|
package/dist/impls/index.d.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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 };
|
package/dist/impls/index.js
CHANGED
|
@@ -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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"}
|