offcourse 1.0.0 ā 1.1.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 +107 -8
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/inspect.js +1 -1
- package/dist/cli/commands/inspect.js.map +1 -1
- package/dist/cli/commands/sync.d.ts +1 -2
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +17 -15
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/commands/syncHighLevel.d.ts +1 -2
- package/dist/cli/commands/syncHighLevel.d.ts.map +1 -1
- package/dist/cli/commands/syncHighLevel.js +8 -9
- package/dist/cli/commands/syncHighLevel.js.map +1 -1
- package/dist/cli/commands/syncLearningSuite.d.ts +35 -0
- package/dist/cli/commands/syncLearningSuite.d.ts.map +1 -0
- package/dist/cli/commands/syncLearningSuite.js +765 -0
- package/dist/cli/commands/syncLearningSuite.js.map +1 -0
- package/dist/cli/index.js +39 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/configManager.d.ts.map +1 -1
- package/dist/config/configManager.js +4 -0
- package/dist/config/configManager.js.map +1 -1
- package/dist/downloader/hlsDownloader.d.ts +10 -4
- package/dist/downloader/hlsDownloader.d.ts.map +1 -1
- package/dist/downloader/hlsDownloader.js +60 -29
- package/dist/downloader/hlsDownloader.js.map +1 -1
- package/dist/downloader/hlsValidator.d.ts.map +1 -1
- package/dist/downloader/hlsValidator.js +6 -2
- package/dist/downloader/hlsValidator.js.map +1 -1
- package/dist/downloader/index.d.ts +7 -0
- package/dist/downloader/index.d.ts.map +1 -1
- package/dist/downloader/index.js +9 -6
- package/dist/downloader/index.js.map +1 -1
- package/dist/downloader/loomDownloader.d.ts +1 -1
- package/dist/downloader/loomDownloader.d.ts.map +1 -1
- package/dist/downloader/loomDownloader.js +32 -27
- package/dist/downloader/loomDownloader.js.map +1 -1
- package/dist/downloader/queue.d.ts +4 -4
- package/dist/downloader/queue.d.ts.map +1 -1
- package/dist/downloader/queue.js.map +1 -1
- package/dist/downloader/vimeoDownloader.d.ts.map +1 -1
- package/dist/downloader/vimeoDownloader.js +7 -3
- package/dist/downloader/vimeoDownloader.js.map +1 -1
- package/dist/scraper/extractor.d.ts +4 -0
- package/dist/scraper/extractor.d.ts.map +1 -1
- package/dist/scraper/extractor.js +79 -79
- package/dist/scraper/extractor.js.map +1 -1
- package/dist/scraper/highlevel/extractor.d.ts +11 -19
- package/dist/scraper/highlevel/extractor.d.ts.map +1 -1
- package/dist/scraper/highlevel/extractor.js +72 -85
- package/dist/scraper/highlevel/extractor.js.map +1 -1
- package/dist/scraper/highlevel/navigator.d.ts +3 -10
- package/dist/scraper/highlevel/navigator.d.ts.map +1 -1
- package/dist/scraper/highlevel/navigator.js +140 -127
- package/dist/scraper/highlevel/navigator.js.map +1 -1
- package/dist/scraper/highlevel/schemas.d.ts +188 -0
- package/dist/scraper/highlevel/schemas.d.ts.map +1 -0
- package/dist/scraper/highlevel/schemas.js +139 -0
- package/dist/scraper/highlevel/schemas.js.map +1 -0
- package/dist/scraper/learningsuite/extractor.d.ts +50 -0
- package/dist/scraper/learningsuite/extractor.d.ts.map +1 -0
- package/dist/scraper/learningsuite/extractor.js +429 -0
- package/dist/scraper/learningsuite/extractor.js.map +1 -0
- package/dist/scraper/learningsuite/index.d.ts +4 -0
- package/dist/scraper/learningsuite/index.d.ts.map +1 -0
- package/dist/scraper/{ghl ā learningsuite}/index.js +1 -1
- package/dist/scraper/learningsuite/index.js.map +1 -0
- package/dist/scraper/learningsuite/navigator.d.ts +122 -0
- package/dist/scraper/learningsuite/navigator.d.ts.map +1 -0
- package/dist/scraper/learningsuite/navigator.js +736 -0
- package/dist/scraper/learningsuite/navigator.js.map +1 -0
- package/dist/scraper/learningsuite/schemas.d.ts +270 -0
- package/dist/scraper/learningsuite/schemas.d.ts.map +1 -0
- package/dist/scraper/learningsuite/schemas.js +147 -0
- package/dist/scraper/learningsuite/schemas.js.map +1 -0
- package/dist/scraper/navigator.d.ts +14 -11
- package/dist/scraper/navigator.d.ts.map +1 -1
- package/dist/scraper/navigator.js +61 -104
- package/dist/scraper/navigator.js.map +1 -1
- package/dist/scraper/schemas.d.ts +57 -0
- package/dist/scraper/schemas.d.ts.map +1 -0
- package/dist/scraper/schemas.js +135 -0
- package/dist/scraper/schemas.js.map +1 -0
- package/dist/scraper/videoInterceptor.d.ts +4 -0
- package/dist/scraper/videoInterceptor.d.ts.map +1 -1
- package/dist/scraper/videoInterceptor.js +66 -51
- package/dist/scraper/videoInterceptor.js.map +1 -1
- package/dist/shared/auth.d.ts +9 -9
- package/dist/shared/auth.d.ts.map +1 -1
- package/dist/shared/auth.js +24 -38
- package/dist/shared/auth.js.map +1 -1
- package/dist/shared/firebase.d.ts +60 -0
- package/dist/shared/firebase.d.ts.map +1 -0
- package/dist/shared/firebase.js +102 -0
- package/dist/shared/firebase.js.map +1 -0
- package/dist/shared/fs.d.ts.map +1 -1
- package/dist/shared/fs.js +4 -0
- package/dist/shared/fs.js.map +1 -1
- package/dist/shared/index.d.ts +3 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +3 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/slug.d.ts +11 -0
- package/dist/shared/slug.d.ts.map +1 -0
- package/{src/shared/slug.ts ā dist/shared/slug.js} +10 -11
- package/dist/shared/slug.js.map +1 -0
- package/dist/shared/url.d.ts +43 -0
- package/dist/shared/url.d.ts.map +1 -0
- package/{src/shared/url.ts ā dist/shared/url.js} +12 -15
- package/dist/shared/url.js.map +1 -0
- package/dist/state/database.d.ts +1 -0
- package/dist/state/database.d.ts.map +1 -1
- package/dist/state/database.js +3 -0
- package/dist/state/database.js.map +1 -1
- package/dist/storage/fileSystem.d.ts +17 -17
- package/dist/storage/fileSystem.d.ts.map +1 -1
- package/dist/storage/fileSystem.js +39 -31
- package/dist/storage/fileSystem.js.map +1 -1
- package/package.json +5 -2
- package/.github/workflows/ci.yml +0 -50
- package/.husky/commit-msg +0 -2
- package/.husky/pre-commit +0 -1
- package/.husky/pre-push +0 -3
- package/.prettierrc +0 -8
- package/.release-it.json +0 -23
- package/ARCHITECTURE.md +0 -233
- package/CHANGELOG.md +0 -78
- package/commitlint.config.js +0 -4
- package/dist/ai/openRouter.d.ts +0 -47
- package/dist/ai/openRouter.d.ts.map +0 -1
- package/dist/ai/openRouter.js +0 -116
- package/dist/ai/openRouter.js.map +0 -1
- package/dist/ai/transcriptPolisher.d.ts +0 -24
- package/dist/ai/transcriptPolisher.d.ts.map +0 -1
- package/dist/ai/transcriptPolisher.js +0 -89
- package/dist/ai/transcriptPolisher.js.map +0 -1
- package/dist/cli/commands/enrich.d.ts +0 -14
- package/dist/cli/commands/enrich.d.ts.map +0 -1
- package/dist/cli/commands/enrich.js +0 -271
- package/dist/cli/commands/enrich.js.map +0 -1
- package/dist/cli/commands/syncGhl.d.ts +0 -20
- package/dist/cli/commands/syncGhl.d.ts.map +0 -1
- package/dist/cli/commands/syncGhl.js +0 -483
- package/dist/cli/commands/syncGhl.js.map +0 -1
- package/dist/cli/commands/syncHighLevel.test.d.ts +0 -2
- package/dist/cli/commands/syncHighLevel.test.d.ts.map +0 -1
- package/dist/cli/commands/syncHighLevel.test.js +0 -102
- package/dist/cli/commands/syncHighLevel.test.js.map +0 -1
- package/dist/config/paths.test.d.ts +0 -2
- package/dist/config/paths.test.d.ts.map +0 -1
- package/dist/config/paths.test.js +0 -70
- package/dist/config/paths.test.js.map +0 -1
- package/dist/config/schema.test.d.ts +0 -2
- package/dist/config/schema.test.d.ts.map +0 -1
- package/dist/config/schema.test.js +0 -151
- package/dist/config/schema.test.js.map +0 -1
- package/dist/downloader/hlsDownloader.test.d.ts +0 -2
- package/dist/downloader/hlsDownloader.test.d.ts.map +0 -1
- package/dist/downloader/hlsDownloader.test.js +0 -116
- package/dist/downloader/hlsDownloader.test.js.map +0 -1
- package/dist/downloader/loomDownloader.test.d.ts +0 -2
- package/dist/downloader/loomDownloader.test.d.ts.map +0 -1
- package/dist/downloader/loomDownloader.test.js +0 -36
- package/dist/downloader/loomDownloader.test.js.map +0 -1
- package/dist/downloader/queue.test.d.ts +0 -2
- package/dist/downloader/queue.test.d.ts.map +0 -1
- package/dist/downloader/queue.test.js +0 -158
- package/dist/downloader/queue.test.js.map +0 -1
- package/dist/downloader/videoDownloader.d.ts +0 -32
- package/dist/downloader/videoDownloader.d.ts.map +0 -1
- package/dist/downloader/videoDownloader.js +0 -173
- package/dist/downloader/videoDownloader.js.map +0 -1
- package/dist/downloader/vimeoDownloader.test.d.ts +0 -2
- package/dist/downloader/vimeoDownloader.test.d.ts.map +0 -1
- package/dist/downloader/vimeoDownloader.test.js +0 -51
- package/dist/downloader/vimeoDownloader.test.js.map +0 -1
- package/dist/scraper/auth.d.ts +0 -29
- package/dist/scraper/auth.d.ts.map +0 -1
- package/dist/scraper/auth.js +0 -115
- package/dist/scraper/auth.js.map +0 -1
- package/dist/scraper/extractor.test.d.ts +0 -2
- package/dist/scraper/extractor.test.d.ts.map +0 -1
- package/dist/scraper/extractor.test.js +0 -65
- package/dist/scraper/extractor.test.js.map +0 -1
- package/dist/scraper/ghl/auth.d.ts +0 -25
- package/dist/scraper/ghl/auth.d.ts.map +0 -1
- package/dist/scraper/ghl/auth.js +0 -187
- package/dist/scraper/ghl/auth.js.map +0 -1
- package/dist/scraper/ghl/extractor.d.ts +0 -96
- package/dist/scraper/ghl/extractor.d.ts.map +0 -1
- package/dist/scraper/ghl/extractor.js +0 -345
- package/dist/scraper/ghl/extractor.js.map +0 -1
- package/dist/scraper/ghl/index.d.ts +0 -4
- package/dist/scraper/ghl/index.d.ts.map +0 -1
- package/dist/scraper/ghl/index.js.map +0 -1
- package/dist/scraper/ghl/navigator.d.ts +0 -93
- package/dist/scraper/ghl/navigator.d.ts.map +0 -1
- package/dist/scraper/ghl/navigator.js +0 -447
- package/dist/scraper/ghl/navigator.js.map +0 -1
- package/dist/scraper/highlevel/auth.d.ts +0 -25
- package/dist/scraper/highlevel/auth.d.ts.map +0 -1
- package/dist/scraper/highlevel/auth.js +0 -189
- package/dist/scraper/highlevel/auth.js.map +0 -1
- package/dist/scraper/highlevel/extractor.test.d.ts +0 -2
- package/dist/scraper/highlevel/extractor.test.d.ts.map +0 -1
- package/dist/scraper/highlevel/extractor.test.js +0 -101
- package/dist/scraper/highlevel/extractor.test.js.map +0 -1
- package/dist/scraper/highlevel/navigator.test.d.ts +0 -2
- package/dist/scraper/highlevel/navigator.test.d.ts.map +0 -1
- package/dist/scraper/highlevel/navigator.test.js +0 -78
- package/dist/scraper/highlevel/navigator.test.js.map +0 -1
- package/dist/scraper/navigator.test.d.ts +0 -2
- package/dist/scraper/navigator.test.d.ts.map +0 -1
- package/dist/scraper/navigator.test.js +0 -63
- package/dist/scraper/navigator.test.js.map +0 -1
- package/dist/scraper/skoolApi.d.ts +0 -17
- package/dist/scraper/skoolApi.d.ts.map +0 -1
- package/dist/scraper/skoolApi.js +0 -72
- package/dist/scraper/skoolApi.js.map +0 -1
- package/dist/state/database.test.d.ts +0 -2
- package/dist/state/database.test.d.ts.map +0 -1
- package/dist/state/database.test.js +0 -34
- package/dist/state/database.test.js.map +0 -1
- package/dist/transcription/whisperService.d.ts +0 -27
- package/dist/transcription/whisperService.d.ts.map +0 -1
- package/dist/transcription/whisperService.js +0 -102
- package/dist/transcription/whisperService.js.map +0 -1
- package/eslint.config.js +0 -55
- package/src/__fixtures__/highlevel-post-response.json +0 -68
- package/src/__fixtures__/hls-master-playlist.m3u8 +0 -24
- package/src/cli/commands/__snapshots__/syncHighLevel.test.ts.snap +0 -38
- package/src/cli/commands/config.ts +0 -74
- package/src/cli/commands/inspect.ts +0 -441
- package/src/cli/commands/login.ts +0 -68
- package/src/cli/commands/status.ts +0 -147
- package/src/cli/commands/sync.ts +0 -1235
- package/src/cli/commands/syncHighLevel.test.ts +0 -144
- package/src/cli/commands/syncHighLevel.ts +0 -639
- package/src/cli/index.ts +0 -121
- package/src/config/configManager.ts +0 -75
- package/src/config/paths.test.ts +0 -83
- package/src/config/paths.ts +0 -36
- package/src/config/schema.test.ts +0 -173
- package/src/config/schema.ts +0 -65
- package/src/downloader/hlsDownloader.test.ts +0 -148
- package/src/downloader/hlsDownloader.ts +0 -327
- package/src/downloader/hlsValidator.ts +0 -196
- package/src/downloader/index.ts +0 -122
- package/src/downloader/loomDownloader.test.ts +0 -43
- package/src/downloader/loomDownloader.ts +0 -742
- package/src/downloader/queue.test.ts +0 -199
- package/src/downloader/queue.ts +0 -118
- package/src/downloader/vimeoDownloader.test.ts +0 -62
- package/src/downloader/vimeoDownloader.ts +0 -722
- package/src/scraper/extractor.test.ts +0 -124
- package/src/scraper/extractor.ts +0 -757
- package/src/scraper/highlevel/__snapshots__/extractor.test.ts.snap +0 -41
- package/src/scraper/highlevel/extractor.test.ts +0 -134
- package/src/scraper/highlevel/extractor.ts +0 -537
- package/src/scraper/highlevel/index.ts +0 -2
- package/src/scraper/highlevel/navigator.test.ts +0 -110
- package/src/scraper/highlevel/navigator.ts +0 -668
- package/src/scraper/highlevel/schemas.ts +0 -183
- package/src/scraper/navigator.test.ts +0 -122
- package/src/scraper/navigator.ts +0 -355
- package/src/scraper/schemas.ts +0 -177
- package/src/scraper/videoInterceptor.ts +0 -435
- package/src/shared/auth.test.ts +0 -58
- package/src/shared/auth.ts +0 -251
- package/src/shared/firebase.ts +0 -151
- package/src/shared/fs.ts +0 -80
- package/src/shared/http.ts +0 -34
- package/src/shared/index.ts +0 -6
- package/src/shared/url.test.ts +0 -122
- package/src/state/database.test.ts +0 -49
- package/src/state/database.ts +0 -919
- package/src/state/index.ts +0 -14
- package/src/storage/fileSystem.test.ts +0 -64
- package/src/storage/fileSystem.ts +0 -175
- package/tsconfig.json +0 -28
- package/vitest.config.ts +0 -29
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export interface PolishedTranscript {
|
|
2
|
-
summary: string;
|
|
3
|
-
transcript: string;
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Convert folder name to readable title.
|
|
7
|
-
* "01-1-herzlich-willkommen" ā "Herzlich Willkommen"
|
|
8
|
-
* "02-onboarding-social-leads-academy" ā "Onboarding Social Leads Academy"
|
|
9
|
-
*/
|
|
10
|
-
export declare function folderNameToTitle(folderName: string): string;
|
|
11
|
-
/**
|
|
12
|
-
* Polish a transcript using an LLM.
|
|
13
|
-
* Returns separate summary and transcript.
|
|
14
|
-
*/
|
|
15
|
-
export declare function polishTranscript(rawTranscript: string): Promise<PolishedTranscript>;
|
|
16
|
-
/**
|
|
17
|
-
* Generate a module summary from multiple lesson summaries.
|
|
18
|
-
*/
|
|
19
|
-
export declare function generateModuleSummary(moduleName: string, lessonSummaries: Array<{
|
|
20
|
-
name: string;
|
|
21
|
-
title: string;
|
|
22
|
-
summary: string;
|
|
23
|
-
}>): Promise<string>;
|
|
24
|
-
//# sourceMappingURL=transcriptPolisher.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transcriptPolisher.d.ts","sourceRoot":"","sources":["../../src/ai/transcriptPolisher.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW5D;AAkCD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0BzF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACvE,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { prompt, isConfigured } from "./openRouter.js";
|
|
2
|
-
/**
|
|
3
|
-
* Convert folder name to readable title.
|
|
4
|
-
* "01-1-herzlich-willkommen" ā "Herzlich Willkommen"
|
|
5
|
-
* "02-onboarding-social-leads-academy" ā "Onboarding Social Leads Academy"
|
|
6
|
-
*/
|
|
7
|
-
export function folderNameToTitle(folderName) {
|
|
8
|
-
return folderName
|
|
9
|
-
// Remove leading numbers and separators (e.g., "01-1-", "02-")
|
|
10
|
-
.replace(/^[\d]+-[\d]*-?/, "")
|
|
11
|
-
// Replace remaining dashes with spaces
|
|
12
|
-
.replace(/-/g, " ")
|
|
13
|
-
// Capitalize each word
|
|
14
|
-
.split(" ")
|
|
15
|
-
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
16
|
-
.join(" ")
|
|
17
|
-
.trim();
|
|
18
|
-
}
|
|
19
|
-
const SYSTEM_PROMPT = `Du bist ein Experte für die Aufbereitung von Video-Transkripten.
|
|
20
|
-
|
|
21
|
-
Deine Aufgabe:
|
|
22
|
-
1. Erstelle eine kurze TLDR-Zusammenfassung (2-3 SƤtze)
|
|
23
|
-
2. Strukturiere den Text in sinnvolle AbsƤtze
|
|
24
|
-
3. Füge Markdown-Formatierung hinzu:
|
|
25
|
-
- **Fettschrift** für wichtige Begriffe und Kernaussagen
|
|
26
|
-
- *Kursiv* für Betonungen
|
|
27
|
-
- Ćberschriften (## oder ###) für klare Themenwechsel
|
|
28
|
-
- AufzƤhlungen wo es Sinn macht
|
|
29
|
-
|
|
30
|
-
Regeln:
|
|
31
|
-
- Behalte den Originaltext bei, Ƥndere keine Wƶrter
|
|
32
|
-
- Korrigiere nur offensichtliche Transkriptionsfehler
|
|
33
|
-
- Füge Absätze an natürlichen Sprechpausen ein
|
|
34
|
-
- Halte alles auf Deutsch`;
|
|
35
|
-
const USER_PROMPT_TEMPLATE = `Hier ist ein Video-Transkript das aufbereitet werden soll:
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
{transcript}
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
Antworte in folgendem Format:
|
|
42
|
-
|
|
43
|
-
## TLDR
|
|
44
|
-
[2-3 SƤtze Zusammenfassung]
|
|
45
|
-
|
|
46
|
-
## Transkript
|
|
47
|
-
|
|
48
|
-
[Aufbereiteter Text mit Markdown-Formatierung]`;
|
|
49
|
-
/**
|
|
50
|
-
* Polish a transcript using an LLM.
|
|
51
|
-
* Returns separate summary and transcript.
|
|
52
|
-
*/
|
|
53
|
-
export async function polishTranscript(rawTranscript) {
|
|
54
|
-
if (!isConfigured()) {
|
|
55
|
-
return {
|
|
56
|
-
summary: "",
|
|
57
|
-
transcript: rawTranscript,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
const userPrompt = USER_PROMPT_TEMPLATE.replace("{transcript}", rawTranscript);
|
|
61
|
-
const result = await prompt(userPrompt, SYSTEM_PROMPT, {
|
|
62
|
-
maxTokens: 8192,
|
|
63
|
-
temperature: 0.2,
|
|
64
|
-
});
|
|
65
|
-
// Parse the response
|
|
66
|
-
const tldrMatch = result.match(/## TLDR\s*\n+([\s\S]*?)(?=\n## Transkript|$)/i);
|
|
67
|
-
const transcriptMatch = result.match(/## Transkript\s*\n+([\s\S]*?)$/i);
|
|
68
|
-
const summary = tldrMatch?.[1]?.trim() ?? "";
|
|
69
|
-
const transcript = transcriptMatch?.[1]?.trim() ?? result;
|
|
70
|
-
return {
|
|
71
|
-
summary,
|
|
72
|
-
transcript,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Generate a module summary from multiple lesson summaries.
|
|
77
|
-
*/
|
|
78
|
-
export async function generateModuleSummary(moduleName, lessonSummaries) {
|
|
79
|
-
if (!isConfigured() || lessonSummaries.length === 0) {
|
|
80
|
-
return "";
|
|
81
|
-
}
|
|
82
|
-
const moduleTitle = folderNameToTitle(moduleName);
|
|
83
|
-
const summariesText = lessonSummaries
|
|
84
|
-
.map((l, i) => `### ${i + 1}. ${l.title}\n${l.summary}`)
|
|
85
|
-
.join("\n\n");
|
|
86
|
-
const result = await prompt(`Hier sind die Zusammenfassungen aller Lektionen des Moduls "${moduleTitle}":\n\n${summariesText}\n\nErstelle eine übergreifende Zusammenfassung des gesamten Moduls (5-8 Sätze). Fasse die wichtigsten Lernziele und Kernkonzepte zusammen.`, "Du bist ein Experte für Kurszusammenfassungen. Antworte auf Deutsch in klarem, präzisem Stil.", { maxTokens: 512, temperature: 0.3 });
|
|
87
|
-
return `# Zusammenfassung: ${moduleTitle}\n\n${result.trim()}\n\n---\n\n## Lektionen\n\n${summariesText}`;
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=transcriptPolisher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transcriptPolisher.js","sourceRoot":"","sources":["../../src/ai/transcriptPolisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOvD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,UAAU;QACf,+DAA+D;SAC9D,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC9B,uCAAuC;SACtC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QACnB,uBAAuB;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;0BAeI,CAAC;AAE3B,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;+CAakB,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,aAAqB;IAC1D,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,aAAa;SAC1B,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE;QACrD,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAExE,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC;IAE1D,OAAO;QACL,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAkB,EAClB,eAAwE;IAExE,IAAI,CAAC,YAAY,EAAE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAElD,MAAM,aAAa,GAAG,eAAe;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACvD,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB,+DAA+D,WAAW,SAAS,aAAa,6IAA6I,EAC7O,+FAA+F,EAC/F,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CACrC,CAAC;IAEF,OAAO,sBAAsB,WAAW,OAAO,MAAM,CAAC,IAAI,EAAE,8BAA8B,aAAa,EAAE,CAAC;AAC5G,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type WhisperModel } from "../../transcription/whisperService.js";
|
|
2
|
-
interface EnrichOptions {
|
|
3
|
-
model?: WhisperModel;
|
|
4
|
-
language?: string;
|
|
5
|
-
force?: boolean;
|
|
6
|
-
limit?: number;
|
|
7
|
-
polish?: boolean;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Enrich command - transcribe videos in a course directory.
|
|
11
|
-
*/
|
|
12
|
-
export declare function enrichCommand(courseDir: string, options: EnrichOptions): Promise<void>;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=enrich.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/enrich.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,uCAAuC,CAAC;AAQ/C,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA8GD;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Mf"}
|
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
import chalk from "chalk";
|
|
2
|
-
import ora from "ora";
|
|
3
|
-
import { existsSync, readdirSync, writeFileSync, readFileSync } from "node:fs";
|
|
4
|
-
import { join, dirname, basename } from "node:path";
|
|
5
|
-
import { transcribeVideo, } from "../../transcription/whisperService.js";
|
|
6
|
-
import { polishTranscript, generateModuleSummary, folderNameToTitle } from "../../ai/transcriptPolisher.js";
|
|
7
|
-
import { isConfigured as isOpenRouterConfigured, getCumulativeUsage, resetCumulativeUsage, } from "../../ai/openRouter.js";
|
|
8
|
-
/**
|
|
9
|
-
* Find all lesson directories with videos, grouped by module.
|
|
10
|
-
*/
|
|
11
|
-
function findLessonsWithVideos(courseDir) {
|
|
12
|
-
const lessons = [];
|
|
13
|
-
function scanDir(dir) {
|
|
14
|
-
const entries = readdirSync(dir, { withFileTypes: true });
|
|
15
|
-
for (const entry of entries) {
|
|
16
|
-
const fullPath = join(dir, entry.name);
|
|
17
|
-
if (entry.isDirectory()) {
|
|
18
|
-
const videoPath = join(fullPath, "video.mp4");
|
|
19
|
-
if (existsSync(videoPath)) {
|
|
20
|
-
// This is a lesson directory
|
|
21
|
-
const moduleDir = dirname(fullPath);
|
|
22
|
-
lessons.push({
|
|
23
|
-
path: fullPath,
|
|
24
|
-
name: entry.name,
|
|
25
|
-
moduleDir,
|
|
26
|
-
moduleName: basename(moduleDir),
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
scanDir(fullPath);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
scanDir(courseDir);
|
|
36
|
-
return lessons;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Check if a lesson already has a transcript.
|
|
40
|
-
*/
|
|
41
|
-
function hasTranscript(lessonDir) {
|
|
42
|
-
return (existsSync(join(lessonDir, "transcript.md")) ||
|
|
43
|
-
existsSync(join(lessonDir, "transcript-raw.txt")));
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Check if a lesson has been polished.
|
|
47
|
-
*/
|
|
48
|
-
function isPolished(lessonDir) {
|
|
49
|
-
const meta = loadMeta(lessonDir);
|
|
50
|
-
return !!meta?.polishedAt;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Load lesson metadata.
|
|
54
|
-
*/
|
|
55
|
-
function loadMeta(lessonDir) {
|
|
56
|
-
const metaPath = join(lessonDir, ".meta.json");
|
|
57
|
-
if (!existsSync(metaPath)) {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
try {
|
|
61
|
-
const content = readFileSync(metaPath, "utf-8");
|
|
62
|
-
return JSON.parse(content);
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Save lesson metadata.
|
|
70
|
-
*/
|
|
71
|
-
function saveMeta(lessonDir, meta) {
|
|
72
|
-
const metaPath = join(lessonDir, ".meta.json");
|
|
73
|
-
writeFileSync(metaPath, JSON.stringify(meta, null, 2), "utf-8");
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Group lessons by module directory.
|
|
77
|
-
*/
|
|
78
|
-
function groupByModule(lessons) {
|
|
79
|
-
const modules = new Map();
|
|
80
|
-
for (const lesson of lessons) {
|
|
81
|
-
const existing = modules.get(lesson.moduleDir) ?? [];
|
|
82
|
-
existing.push(lesson);
|
|
83
|
-
modules.set(lesson.moduleDir, existing);
|
|
84
|
-
}
|
|
85
|
-
return modules;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Enrich command - transcribe videos in a course directory.
|
|
89
|
-
*/
|
|
90
|
-
export async function enrichCommand(courseDir, options) {
|
|
91
|
-
console.log(chalk.blue("\nš Enrich: Video Transcription\n"));
|
|
92
|
-
if (!existsSync(courseDir)) {
|
|
93
|
-
console.log(chalk.red(`Course directory not found: ${courseDir}`));
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
const model = options.model ?? "small";
|
|
97
|
-
const language = options.language ?? "de";
|
|
98
|
-
const shouldPolish = options.polish ?? false;
|
|
99
|
-
console.log(chalk.gray(` Model: ${model}`));
|
|
100
|
-
console.log(chalk.gray(` Language: ${language}`));
|
|
101
|
-
if (shouldPolish) {
|
|
102
|
-
if (isOpenRouterConfigured()) {
|
|
103
|
-
console.log(chalk.gray(` Polish: enabled (OpenRouter)`));
|
|
104
|
-
resetCumulativeUsage(); // Reset usage tracking
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
console.log(chalk.yellow(` Polish: disabled (OPENROUTER_API_KEY not set)`));
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
console.log(chalk.gray(` Directory: ${courseDir}\n`));
|
|
111
|
-
// Find all lessons with videos
|
|
112
|
-
const allLessons = findLessonsWithVideos(courseDir);
|
|
113
|
-
console.log(chalk.gray(` Found ${allLessons.length} lessons with videos\n`));
|
|
114
|
-
if (allLessons.length === 0) {
|
|
115
|
-
console.log(chalk.yellow("No videos found to transcribe."));
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
// Filter lessons that need processing
|
|
119
|
-
let lessonsToProcess = allLessons.filter((lesson) => {
|
|
120
|
-
if (options.force)
|
|
121
|
-
return true;
|
|
122
|
-
if (shouldPolish && hasTranscript(lesson.path) && !isPolished(lesson.path)) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
return !hasTranscript(lesson.path);
|
|
126
|
-
});
|
|
127
|
-
if (options.limit) {
|
|
128
|
-
lessonsToProcess = lessonsToProcess.slice(0, options.limit);
|
|
129
|
-
}
|
|
130
|
-
if (lessonsToProcess.length === 0) {
|
|
131
|
-
console.log(chalk.green("All videos already transcribed. Use --force to re-transcribe."));
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
console.log(chalk.blue(`Processing ${lessonsToProcess.length} videos...\n`));
|
|
135
|
-
let transcribed = 0;
|
|
136
|
-
let polished = 0;
|
|
137
|
-
let failed = 0;
|
|
138
|
-
// Track polished lessons for module summaries
|
|
139
|
-
const polishedLessons = [];
|
|
140
|
-
for (const lesson of lessonsToProcess) {
|
|
141
|
-
const videoPath = join(lesson.path, "video.mp4");
|
|
142
|
-
const transcriptMdPath = join(lesson.path, "transcript.md");
|
|
143
|
-
const summaryPath = join(lesson.path, "summary.md");
|
|
144
|
-
const transcriptTxtPath = join(lesson.path, "transcript-raw.txt");
|
|
145
|
-
const spinner = ora(` ${lesson.name}`).start();
|
|
146
|
-
try {
|
|
147
|
-
let transcriptText;
|
|
148
|
-
// Check if we already have a raw transcript
|
|
149
|
-
if (existsSync(transcriptTxtPath) && shouldPolish && !options.force) {
|
|
150
|
-
transcriptText = readFileSync(transcriptTxtPath, "utf-8");
|
|
151
|
-
spinner.text = ` ${lesson.name} (polishing...)`;
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
// Transcribe video
|
|
155
|
-
const result = await transcribeVideo(videoPath, { model, language });
|
|
156
|
-
transcriptText = result.text;
|
|
157
|
-
writeFileSync(transcriptTxtPath, transcriptText, "utf-8");
|
|
158
|
-
const speedFactor = result.duration > 0
|
|
159
|
-
? (result.duration / result.processingTime).toFixed(1)
|
|
160
|
-
: "?";
|
|
161
|
-
spinner.text = ` ${lesson.name} (${Math.round(result.duration)}s ā ${result.processingTime.toFixed(1)}s, ${speedFactor}x)`;
|
|
162
|
-
transcribed++;
|
|
163
|
-
}
|
|
164
|
-
// Polish with LLM if requested
|
|
165
|
-
if (shouldPolish && isOpenRouterConfigured()) {
|
|
166
|
-
spinner.text = ` ${lesson.name} (polishing with AI...)`;
|
|
167
|
-
try {
|
|
168
|
-
const polishedResult = await polishTranscript(transcriptText);
|
|
169
|
-
// Save summary separately
|
|
170
|
-
const lessonTitle = folderNameToTitle(lesson.name);
|
|
171
|
-
if (polishedResult.summary) {
|
|
172
|
-
writeFileSync(summaryPath, `# Zusammenfassung: ${lessonTitle}\n\n${polishedResult.summary}\n`, "utf-8");
|
|
173
|
-
}
|
|
174
|
-
// Save formatted transcript with title
|
|
175
|
-
const transcriptWithTitle = `# Transkript: ${lessonTitle}\n\n${polishedResult.transcript}`;
|
|
176
|
-
writeFileSync(transcriptMdPath, transcriptWithTitle, "utf-8");
|
|
177
|
-
polished++;
|
|
178
|
-
polishedLessons.push(lesson);
|
|
179
|
-
const meta = loadMeta(lesson.path) ?? {
|
|
180
|
-
syncedAt: new Date().toISOString(),
|
|
181
|
-
updatedAt: null,
|
|
182
|
-
videoUrl: null,
|
|
183
|
-
videoType: null,
|
|
184
|
-
};
|
|
185
|
-
meta.polishedAt = new Date().toISOString();
|
|
186
|
-
saveMeta(lesson.path, meta);
|
|
187
|
-
}
|
|
188
|
-
catch (polishError) {
|
|
189
|
-
// Save unpolished as fallback
|
|
190
|
-
writeFileSync(transcriptMdPath, transcriptText, "utf-8");
|
|
191
|
-
console.log(chalk.yellow(`\n Polish failed: ${polishError}`));
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
// Save raw transcript as markdown
|
|
196
|
-
writeFileSync(transcriptMdPath, transcriptText, "utf-8");
|
|
197
|
-
}
|
|
198
|
-
// Update metadata
|
|
199
|
-
const meta = loadMeta(lesson.path) ?? {
|
|
200
|
-
syncedAt: new Date().toISOString(),
|
|
201
|
-
updatedAt: null,
|
|
202
|
-
videoUrl: null,
|
|
203
|
-
videoType: null,
|
|
204
|
-
};
|
|
205
|
-
meta.transcribedAt = new Date().toISOString();
|
|
206
|
-
saveMeta(lesson.path, meta);
|
|
207
|
-
const statusSuffix = shouldPolish && isOpenRouterConfigured() ? " + polished" : "";
|
|
208
|
-
spinner.succeed(` ${lesson.name}${statusSuffix}`);
|
|
209
|
-
}
|
|
210
|
-
catch (error) {
|
|
211
|
-
spinner.fail(` ${lesson.name}`);
|
|
212
|
-
console.log(chalk.red(` Error: ${error}`));
|
|
213
|
-
failed++;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
// Generate module summaries if we polished any lessons
|
|
217
|
-
if (polished > 0 && isOpenRouterConfigured()) {
|
|
218
|
-
console.log(chalk.blue("\nš Generating module summaries...\n"));
|
|
219
|
-
const moduleGroups = groupByModule(polishedLessons);
|
|
220
|
-
for (const [moduleDir, moduleLessons] of moduleGroups) {
|
|
221
|
-
const moduleName = basename(moduleDir);
|
|
222
|
-
const spinner = ora(` ${moduleName}`).start();
|
|
223
|
-
try {
|
|
224
|
-
// Collect all lesson summaries for this module
|
|
225
|
-
const lessonSummaries = [];
|
|
226
|
-
for (const lesson of moduleLessons) {
|
|
227
|
-
const summaryPath = join(lesson.path, "summary.md");
|
|
228
|
-
if (existsSync(summaryPath)) {
|
|
229
|
-
const content = readFileSync(summaryPath, "utf-8");
|
|
230
|
-
// Extract just the summary text (skip the heading)
|
|
231
|
-
const summaryText = content.replace(/^#[^\n]+\n+/, "").trim();
|
|
232
|
-
const lessonTitle = folderNameToTitle(lesson.name);
|
|
233
|
-
lessonSummaries.push({ name: lesson.name, title: lessonTitle, summary: summaryText });
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
if (lessonSummaries.length > 0) {
|
|
237
|
-
const moduleSummary = await generateModuleSummary(moduleName, lessonSummaries);
|
|
238
|
-
const moduleSummaryPath = join(moduleDir, "summary.md");
|
|
239
|
-
writeFileSync(moduleSummaryPath, moduleSummary, "utf-8");
|
|
240
|
-
spinner.succeed(` ${moduleName} (${lessonSummaries.length} lessons)`);
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
spinner.warn(` ${moduleName} (no summaries found)`);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
catch (error) {
|
|
247
|
-
spinner.fail(` ${moduleName}`);
|
|
248
|
-
console.log(chalk.red(` Error: ${error}`));
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
// Final summary
|
|
253
|
-
console.log(chalk.green(`\nā
Enrichment complete!`));
|
|
254
|
-
console.log(chalk.gray(` Transcribed: ${transcribed}`));
|
|
255
|
-
if (polished > 0) {
|
|
256
|
-
console.log(chalk.gray(` Polished: ${polished}`));
|
|
257
|
-
}
|
|
258
|
-
if (failed > 0) {
|
|
259
|
-
console.log(chalk.red(` Failed: ${failed}`));
|
|
260
|
-
}
|
|
261
|
-
// Show API usage if polishing was done
|
|
262
|
-
if (polished > 0 && isOpenRouterConfigured()) {
|
|
263
|
-
const usage = getCumulativeUsage();
|
|
264
|
-
console.log(chalk.gray(`\n API Usage:`));
|
|
265
|
-
console.log(chalk.gray(` Tokens: ${usage.totalTokens.toLocaleString()} (${usage.promptTokens.toLocaleString()} in / ${usage.completionTokens.toLocaleString()} out)`));
|
|
266
|
-
if (usage.cost !== undefined && usage.cost > 0) {
|
|
267
|
-
console.log(chalk.gray(` Cost: $${usage.cost.toFixed(4)}`));
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
//# sourceMappingURL=enrich.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../../src/cli/commands/enrich.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
interface SyncGHLOptions {
|
|
2
|
-
skipVideos?: boolean;
|
|
3
|
-
skipContent?: boolean;
|
|
4
|
-
dryRun?: boolean;
|
|
5
|
-
limit?: number;
|
|
6
|
-
visible?: boolean;
|
|
7
|
-
quality?: string;
|
|
8
|
-
courseName?: string;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Detects if a URL is a GHL/ClientClub portal.
|
|
12
|
-
*/
|
|
13
|
-
export declare function isGHLPortal(url: string): boolean;
|
|
14
|
-
/**
|
|
15
|
-
* Handles the sync-ghl command.
|
|
16
|
-
* Downloads all content from a GoHighLevel/ClientClub course portal.
|
|
17
|
-
*/
|
|
18
|
-
export declare function syncGhlCommand(url: string, options: SyncGHLOptions): Promise<void>;
|
|
19
|
-
export {};
|
|
20
|
-
//# sourceMappingURL=syncGhl.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"syncGhl.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/syncGhl.ts"],"names":[],"mappings":"AA8EA,UAAU,cAAc;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAaD;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAqBhD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAyTxF"}
|